union,C語言中使用比較少的一個東西,其實并不複雜。本質上來說,他和結構體是一樣的,隻是在包裝角度看有些差異。
形式
union 共用體名{
資料類型 成員名;
資料類型 成員名;
...
}變量名;
特點
1.共用體表示幾個變量共用一個記憶體位置,在不同的時間儲存不同的資料類型和不同長度的變量。在union中,所有的共用體成員共用一個空間,并且同一時間隻能儲存其中一個成員變量的值。
2.union中可以定義多個成員,union的大小由最大的成員的大小決定。
3.對某一個成員指派,會覆寫其他成員的值。
當成員所占位元組數不同時,隻會覆寫相應位元組上的值。例:char隻占1個位元組,而int占4個位元組,則char類型資料隻會覆寫int類型資料的低位址1位元組。
4.聯合體union的存放順序是所有成員都從低位址開始存放的。
比如0x1234中,0x12是高位址,而0x34是低位址。
執行個體
有如下一段程式:
#include <stdio.h>
main()
{
union
{
char c;
int i;
float a;
}test;
test.i=0x1234;
test.c='A';
printf("%x\n",test.i);
}
程式運作結果:1241
程式中先給i指派,再給c指派,因為i為int類型,而c為char類型,是以,當在給c指派之後,會指派原來已有的i的值,但又不足以完全覆寫,進而得到運作結果。
與結構體差別
1. 共用體和結構體都是由多個不同的資料類型成員組成, 但在任何同一時刻, 共用體隻存放了一個被選中的成員, 而結構體的所有成員都存在。
2. 對于共用體的不同成員指派, 将會對其它成員重寫, 原來成員的值就不存在了, 而對于結構體的不同成員指派是互不影響的。
擴充
union的指派操作涉及到資料所占字元大小的問題,以下是在32位作業系統下的部分資料類型所占位元組:
1:整形
int 4位元組
longint 4位元組
shortint 2位元組
unsignedint 4位元組
unsignedlong int 4位元組
unsignedshort int 2位元組
2:字元型
char 1位元組
unsignedchar 1位元組
3:浮點型
float 4位元組
double 8位元組
longdouble 8位元組
unsigned longdouble 8位元組
unsigneddouble 4位元組
4:字元串型
string 32位元組
5:指針類型
所有類型的指針都是 4位元組
......