幾個不同的變量共享一段內存的結構,稱爲“共用體”類型的結構。
定義共用體類型變量的一般形式爲:
union 共用體名
{
成員表列
}變量表列;
例如:
union Data
{
int i; //表示不同類型的變量i,ch,f可以存放到同一段存儲單元中
char ch;
float f;
}a, b, c; //變量
在地址空間中表示如下圖:
以上3個變量在內存中佔的字節數不同,但都是從同一地址開始(圖中設爲1000)存放,也就是使用覆蓋技術,後一個數據覆蓋了前面的數據。
共用體類型數據的特點:
(1)同一內存段可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一個成員,而不是同時存放幾個。
union Data
{
int i; //表示不同類型的變量i,ch,f可以存放到同一段存儲單元中
char ch;
float f;
}a, b, c; //變量
a.i = 97;
表示將整數97存放在共用體變量中,輸出結果如下。
97換成16進製爲0x00000061,又因爲電腦的存儲方式爲小端格式,所以在地址中存在的方式如下圖
因爲float的存儲方式不同,解碼時會按照獨自的方式計算解碼(可自行搜索float類型數據在內存中的存儲方式),所以輸出爲0.00000。
當a.f = 0x61;時,輸出入下圖:(打印a.ch時,因爲0x0不能用字符打印,所以用的整型,效果一樣)
存儲方式爲:
所以float類型97存儲的十六進制爲0x42C20000。
(2)可以對共用體變量初始化,但初始化表中只能有一個常量。
union Data
{
int i; //表示不同類型的變量i,ch,f可以存放到同一段存儲單元中
char ch;
float f;
}a = {1,'a',1.5}; //不能初始化3個成員,他們佔用同一段存儲單元
union Data a = {16}; //正確,對第一個成員初始化
union Data a = {.ch = 'j'}; //C99允許對指定的一個成員初始化
(3)共用體變量中起作用的成員是最後一次被賦值的成員,在對共同體變量中的一個成員賦值後,原有變量存儲單元中的值就被取代。
(4)共用體變量的地址和它的個成員的地址都是同一個地址。例如:&a.i,&a.ch,&a.f都是同一值。
(6)共用體類型可以出現結構體類型定義中,也可以定義共用體數組。結構體中也可以出現在共用體類型定義中,數組也可以作爲共用體成員。
用途:
在數據處理中,需要對同一空間安排不同的用途,使用共同體比較方便。
例:有若干個人員的數據,其中有學生和教師。學生的數據中包括:姓名、號碼、性別、職業、班級。教師的數據包括:姓名、號碼、性別、職業、職務。要求用同一表格來處理。
可以看出:學生和老師的數據的項目大多數是相同的,只有一個不同,學生的班級,教師的職位。
struct{
int num; //成員 編號
char name[10]; //成員 姓名
char sex; //成員 性別
union{ //聲明無名共用體類型
int class; //成員 班級
char position[10];//成員 職務
}category;
}person[2];