聯合也叫共用體。
聯合也是一種特殊的自定義型別 這種型別定義的變數也包含一系列的成員,特徵是這些成員公用同一塊空間(所以聯合也叫共用體)。比如:
//聯合型別的宣告
union un
;//聯合變數的定義
union un un;
//計算連個變數的大小
我們發現,這裡不管是u的位址,還是u的成員變數的位址,都是一致的。
聯合的成員是共用同一塊記憶體空間的,這樣乙個聯合變數的大小,至少是最大成員的大小(因為聯合至少得有能力儲存最大的那個成員)。
union un
;union un un;
// 下面輸出的結果是一樣的嗎?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//下面輸出的結果是什麼?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
結果是11223355.
說明在使用聯合的時候,裡面的成員變數同一時刻只能使用乙個。
面試題:判斷當前計算機的大小端儲存。
判斷大小端:只需要看第乙個位元組裡放的是什麼。
首先拿到位址,再把位址強制轉換成字元指標,
*(char*)&a,如果是1,就是小端;是0,就是大端。
那麼用聯合體如何實現?
char c;
int i;
正好c不就佔了乙個位元組嗎?
我們可以對i賦值,
然後看c裡放的是什麼。
int check_sys()
u; u.i = 1;
return u.c;
}
聯合的大小至少是最大成員的大小。當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。比如:
union un1
;union un2
;//下面輸出的結果是什麼?
printf("%d\n", sizeof(union un1));
printf("%d\n", sizeof(union un2));
對於un1,
char c[5]的每個元素大小是1,預設對齊數是8,所以他的對齊數是1;
int i大小是4,預設對齊數是8,所以他的對齊數是4.
綜上,un1的大小是最大對齊數的整數倍,也就是4的倍數。
再看成員:
char c[5]的大小是5,也是最大成員大小,
但是5並不是最大對齊數的整數倍,
所以要對齊到最大對齊數的整數倍,也就是4n,
所以最終應該是8,佔8個位元組。
C語言高階篇 第四講 自定義型別之列舉
列舉顧名思義就是一一枚舉。把可能的取值一一枚舉。比如我們現實生活中 一周的星期一到星期日是有限的7天,可以一一枚舉。性別有 男 女,也可以一一枚舉。月份有12個月,也可以一一枚舉 顏色也可以一一枚舉。這裡就可以使用列舉了。enum day 星期 enum 性別 enum color 顏色 以上定義的...
C 研發 核心篇 第四講 4 7 多型
4.7.1 多型的基本概念 多型是c 物件導向三大特性之一 多型分為兩類 靜態多型和動態多型區別 下面通過案例進行講解多型 class animal class cat public animal class dog public animal 我們希望傳入什麼物件,那麼就呼叫什麼物件的函式 如果函...
C語言入門筆記 第四講 分支語句
單分支型 情況一 語法結構 if 表示式 語句 如果表示式為真,執行語句 如果表示式為假,什麼都不執行。情況二 if 表示式 語句1 else 語句2 如果表示式為真,執行語句1 如果表示式為假,執行語句2。多分支型 多分支 if 表示式1 語句1 else if 表示式2 語句2 else 語句3...