在c語言中,一種和結構體非常類似的語法,叫做共用體(union),它的定義格式為:
union 共用體名;
結構體和共用體的區別在於:結構體的各個成員會占用不同的記憶體,互相之間沒有影響;而共用體的所有成員占用同一段記憶體,修改乙個成員會影響其餘所有成員。
結構體占用的記憶體大於等於所有成員占用的記憶體的總和(成員之間可能會存在縫隙),共用體占用的記憶體等於最長的成員占用的記憶體。共用體使用了記憶體覆蓋技術,同一時刻只能儲存乙個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。
共用體也是一種自定義型別,可以通過它來建立變數,例如:
union data;
union data a, b, c;
上面是先定義共用體,再建立變數,也可以在定義共用體的同時建立變數:
union data a, b, c;
如果不再定義新的變數,也可以將共用體的名字省略:
union a, b, c;
共用體 data 中,成員 f 占用的記憶體最多,為 8 個位元組,所以 data 型別的變數(也就是 a、b、c)也占用 8 個位元組的記憶體,請看下面的演示:
#include union data;
int main()
執行結果:
4, 4
40, @, 40
39, 9, 39
2059, y, 2059
3e25ad54, t, ad54
這段**不但驗證了共用體的長度,還說明共用體成員之間會相互影響,修改乙個成員的值會影響其他成員。
要想理解上面的輸出結果,弄清成員之間究竟是如何相互影響的,就得了解各個成員在記憶體中的分布。以上面的 data 為例,各個成員在記憶體中的分布如下:
成員 n、ch、m 在記憶體中「對齊」到一頭,對 ch 賦值修改的是前乙個位元組,對 m 賦值修改的是前兩個位元組,對 n 賦值修改的是全部位元組。也就是說,ch、m 會影響到 n 的一部分資料,而 n 會影響到 ch、m 的全部資料。
接下來是判斷大小端的方法:
大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。
測試**:
#include #include union data;
int test()
int main()
參考:c語言中文 C語言中的聯合體
聯 合 union 1.聯合說明和聯合變數定義 聯合也是一種新的資料型別,它是一種特殊形式的變數。聯合說明和聯合變數定義與結構十分相似。其形式為 union 聯合名 聯合變數名 聯合表示幾個變數公用乙個記憶體位置,在不同的時間儲存不同的資料型別 和不同長度的變數。下例表示說明乙個聯合a bc uni...
C語言中的聯合體union
在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...
C語言中的聯合體union
在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...