C語言 聯合(union)

2021-10-03 21:16:56 字數 2441 閱讀 2080

聯合(union)是一種資料型別,他能在同一塊空間中儲存不同資料型別,但不是同時儲存。如果我們想設計一種結構,其能儲存一些既無規律,也無順序的資料,那麼就可以用到聯合。

建立聯合和建立結構體相同,需要宣告乙個模板,再用這個模板建立變數,下面給出例子:

union stu

;

根據上面宣告,該結構可以儲存乙個int型別,乙個char型別,乙個double型別和char型別的陣列。然而,建立出的變數只能儲存上面所說的型別的一種。而且該變數的大小,為模板中所佔位元組數最大的那個型別決定,本例中為32位元組(char name[32])。

union stu ustu1;

// stu型別的聯合變數 32位元組

union stu ustu2[10]

;// 內含10個聯合變數的陣列 10*32 位元組

union stu *ustu3; // 指向stu型別聯合變數的指標 4位元組(32位編譯器)

和結構體不同的是,聯合只能儲存乙個值,所以他的初始化就比較獨特:

union stu ustu1;

ustu1.***=

'm';

union stu ustu2 = ustu1;

// 用另乙個聯合來初始化

union stu ustu3 =

;// 初始化聯合的第乙個成員 num

union stu ustu4 =

;// 指定初始化器

ustu1.num =12;

// 把12儲存在ustu1 中,佔4位元組

ustu1.score =

96.6

;// 清除12,儲存 96.6,佔8位元組

ustu1.*** =

'f';

// 清除96.6,儲存 f,佔1位元組

. 運算子 和 -> 運算子訪問聯合內的成員的方法和結構體差不多,不過有一點要注意,聯合一次只能儲存乙個值,就算有足夠的空間,也不能同時儲存和訪問兩個型別不同的值。比如:

ustu1.num =12;

puts

(ustu1.name)

;

struct stu

;struct teach

;union info

;struct people

type;

union info info;};

struct people people;

我們用struct people 定義了乙個結構體變數people, 那我們就可以用這個函式來獲取第n位老師/學生的編號:

int

get_number

(struct people *people,

int n)

else

}

當people的type的成員為teacher時,它的info成員為老師,

當people的type的成員為student時,它的info成員為學生,

同理,可獲得老師/學生其他資訊。

這段**雖然得到了我們想要的結果,但是有個缺陷。之前我們提到,聯合的大小,為其內部結構中最大的那個結構的大小,如圖:

stu的大小為48,teach的大小為112,聯合info中有50個stu,所佔記憶體為5048=2400,20個teach,所佔記憶體為10112 = 1120,所以,聯合的大小為2400,但當聯合儲存的是較小的成員,像teach,就本例而言,足足浪費了1280位元組。在這種情況下,更好的方法是在聯合中儲存指向不同成員的指標而不是直接儲存成員本身。因為所有的指標長度都是一樣的,這樣就解決了記憶體浪費的問題。

改寫聯合宣告:

union info

;

內部就可以用鍊錶來儲存資料了。

匿名聯合和匿名結構的工作原理相同,即匿名聯合是乙個結構或聯合的無名聯合成員。例如,我們重新定義struct people結構:

struct stu

;struct teach

;struct people

type;

union info ;

};struct people people;

這下我們如果再想獲取獲取第乙個學生的學號,就可以用:

people.stu[0]

.number;

來代替

people.info.stu[0]

.number;

c語言 union聯合體

linux中聯合體union實現判斷little endian 和 big endian 大端和小端 1 聯合體的資料成員從低位元組開始對齊 2 little endian 和 big endian。little endian 和 big endian 是 cpu 存放資料的兩種不同順序。對於整型 ...

C語言聯合體union

c語言中的聯合體union 在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int ma...

C語言之聯合體Union

共用體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義乙個帶有多成員的共用體,但是任何時候只能有乙個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。定義共用體union 為了定義共用體,您必須使用union語句,方式與定義結構類似。union 語句定義了乙個新...