C語(yǔ)言 共用體

2023-01-11 16:26 更新

共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲(chǔ)不同的數(shù)據(jù)類型。您可以定義一個(gè)帶有多成員的共用體,但是任何時(shí)候只能有一個(gè)成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。

定義共用體

為了定義共用體,您必須使用 union 語(yǔ)句,方式與定義結(jié)構(gòu)類似。union 語(yǔ)句定義了一個(gè)新的數(shù)據(jù)類型,帶有多個(gè)成員。union 語(yǔ)句的格式如下:

union [union tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];  

union tag 是可選的,每個(gè) member definition 是標(biāo)準(zhǔn)的變量定義,比如 int i; 或者 float f; 或者其他有效的變量定義。在共用體定義的末尾,最后一個(gè)分號(hào)之前,您可以指定一個(gè)或多個(gè)共用體變量,這是可選的。下面定義一個(gè)名為 Data 的共用體類型,有三個(gè)成員 i、f 和 str:

union Data
{
   int i;
   float f;
   char  str[20];
} data;  

現(xiàn)在,Data 類型的變量可以存儲(chǔ)一個(gè)整數(shù)、一個(gè)浮點(diǎn)數(shù),或者一個(gè)字符串。這意味著一個(gè)變量(相同的內(nèi)存位置)可以存儲(chǔ)多個(gè)多種類型的數(shù)據(jù)。您可以根據(jù)需要在一個(gè)共用體內(nèi)使用任何內(nèi)置的或者用戶自定義的數(shù)據(jù)類型。

共用體占用的內(nèi)存應(yīng)足夠存儲(chǔ)共用體中最大的成員。例如,在上面的實(shí)例中,Data 將占用 20 個(gè)字節(jié)的內(nèi)存空間,因?yàn)樵诟鱾€(gè)成員中,字符串所占用的空間是最大的。下面的實(shí)例將顯示上面的共用體占用的總內(nèi)存大?。?/p>

#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        

   printf( "Memory size occupied by data : %d\n", sizeof(data));

   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Memory size occupied by data : 20

訪問(wèn)共用體成員

為了訪問(wèn)共用體的成員,我們使用成員訪問(wèn)運(yùn)算符(.)。成員訪問(wèn)運(yùn)算符是共用體變量名稱和我們要訪問(wèn)的共用體成員之間的一個(gè)句號(hào)。您可以使用 union 關(guān)鍵字來(lái)定義共用體類型的變量。下面的實(shí)例演示了共用體的用法:

#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        

   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");

   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);

   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

在這里,我們可以看到共用體的 if 成員的值有損壞,因?yàn)樽詈筚x給變量的值占用了內(nèi)存位置,這也是 str 成員能夠完好輸出的原因?,F(xiàn)在讓我們?cè)賮?lái)看一個(gè)相同的實(shí)例,這次我們?cè)谕粫r(shí)間只使用一個(gè)變量,這也演示了使用共用體的主要目的:

#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        

   data.i = 10;
   printf( "data.i : %d\n", data.i);
   
   data.f = 220.5;
   printf( "data.f : %f\n", data.f);
   
   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);

   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

data.i : 10
data.f : 220.500000
data.str : C Programming

在這里,所有的成員都能完好輸出,因?yàn)橥粫r(shí)間只用到一個(gè)成員。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)