C語言中的聯合體 (記錄)

2021-09-11 02:08:11 字數 1486 閱讀 9659

在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型別是共享記...