1:共用體(union)類型的定義
union myunion
{
int a;
char b;
};
int main(void)
{
myunion u1;
u1.a = 23;
printf("u1.b = %d\n", u1.b); //23
printf("&u1.a = %p \n",&(u1.a)); //&u1.a = 0xbfbe5c04
printf("&u1.b = %p \n",&(u1.b)); //&u1.b = 0xbfbe5c04
}
總體上來講共用體和結構體的定義方法很類似,使用方法也基本一樣
2:共用體和結構體的區別
(1)結構體類似於一個包裹,結構體中的成員彼此是獨立存在的,分布在內存的不同單元中,他們只是被打包成一個整體叫做結構體而已;共用體中的各個成員其實是一體的,彼此不獨立,他們使用同一個內存單元。可以理解為:有時候是這個元素,有時候是那個元素。更准確的說法是同一個內存空間有多種解釋方式。也就是說共用體是同一個內存空間,裡面存放的數值(二進制)是一樣的,使用u1.a去訪問這個內存時是按int類型去解析這個內存空間,使用u1.b去訪問這個內存時是按char類型去解析這個內存空間。總的來說共用體就是同一塊存放著二進制數的內存空間的不同理解方式。
(2)使用sizeof去測量共用體的大小時,測得的是union中各個元素裡面占用內存最大的那個元素的大小。因為這樣才能夠存放下所有的元素。
(3)union中的元素不存在內存對齊的問題,因為union中實際只有1個類型的內存空間,都是從同一個地址開始的(開始地址就是整個union占有的內存空間的首地址),所以不涉及內存對齊。
3:共用體的主要用途
(1)共用體就用在那種對同一個內存單元進行多種不同規則解析的這種情況下。
(2)C語言中其實是可以沒有共用體的,用指針和強制類型轉換可以替代共用體完成同樣的功能,但是共用體的方式更簡單、更便捷、更好理解。