union,中文名「聯合體、共用體」,在某種程度上類似結構體struct的一種資料結構,共用體(union)和結構體(struct)同樣可以包含很多種資料型別和變數。
但在「聯合」中, 各成員共享一段記憶體空間, 乙個聯合變數的長度等於各成員中最長的長度 。乙個聯合體型別必須經過定義之後, 才能使用它,才能把乙個變數宣告定義為該聯合體型別。
當定義結構物件時,如果沒有顯式地初始化它們,則會採用一般初始化規則:如果該結構物件屬於動態儲存型別,那麼其成員具有不確定的初始值。
另一方面,如果結構物件具有靜態儲存週期,那麼其非指標成員初始值是 0,其指標成員初始值是空指標。
不同於結構成員——它們在結構中都具有單獨的記憶體位置,聯合成員則共享同乙個記憶體位置。也就是說,聯合中的所有成員都是從相同的記憶體位址開始。因此,可以定義乙個擁有許多成員的聯合,但是同一時刻只能有乙個成員允許含有乙個值。聯合讓程式設計師可以方便地通過不同方式使用同乙個記憶體位置。
一、定義聯合(union)
聯合的定義方式與結構是一樣的,只是把關鍵字 struct 改成 union:
union [標籤名稱];下面的例子定義了乙個名為data的聯合型別,它有 3 個成員:i、x 和 str:
union data ;這種型別的物件可以儲存乙個整數、乙個浮點數或乙個短字串。
例如:
union statemachine乙個union 只配置乙個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double 型態,所以statemachine 的空間大小就是double 資料型別的大小。char character;
int number;
char *str;
double exp;
在c++裡,union 的成員預設屬性頁為public。union 主要用來壓縮空間。如果一些資料不可能在同一時間同時被用到,則可以使用union。
二、初始化聯合(union)
與結構類似,通過初始化列表(initialization list)來初始化聯合物件。但是,對聯合來說,列表只有乙個初始化器(initializer)。
與結構一樣,c99 允許在初始化器中使用成員指示符來指示哪個成員被初始化。而且,如果初始化器沒有成員指示符,那麼就與聯合內的第乙個成員關聯。具有自動儲存類的聯合物件也可以使用已有的同型別物件來初始化。下面是一些初始化例子:
union data var1=,陣列 mydata 中的元素如果沒有指定初始化器,會被隱式地初始化為 0 值。var2=,
var3=var1,
mydata[100]=,,var2};
三、聯合體變數的宣告
聯合變數的說明和結構變數的宣告方式相同, 也有三種形式:
第一種 , 先定義聯合體型別,再宣告聯合體變數 ;
第二種 ,定義聯合體型別的同時宣告聯合體變數;
第三種 ,直接宣告聯合體(以匿名的形式定義聯合體型別)。
以perdata型別為例,說明如下:
第一種, 先定義聯合體型別,再宣告聯合體變數
union perdata第二種, 定義聯合體型別的同時宣告聯合體變數:int class;
char officae[10];
union perdata a,b; /*說明a,b為perdata型別*/
union perdata第三種, 直接宣告聯合體(以匿名的形式定義聯合體型別):int class;
char office[10];
} a , b ;
union經說明後的a,b變數均為perdata型別。a,b變數的長度應等於 perdata 的成員中最長的長度, 即等於office陣列的長度,共10個位元組。對a,b變數如賦予整型值時,只使用了2個位元組,而賦予字元陣列時,可用10個位元組。int class;
char office[10];
}a,b
四、聯合體變數的賦值和使用
對聯合體變數的賦值,使用都只能是對變數的成員進行。
聯合變數的成員表示為: 聯合變數名 . 成員名
例如,a被說明為perdata型別的變數之後,可使用 a.class,a.office
不允許只用聯合變數名作賦值或其它操作。 也不允許對聯合變數作初始化賦值,賦值只能在程式中進行。
乙個聯合體變數, 每次只能賦予乙個成員值。乙個聯合變數的值就是聯合變員的某乙個成員值。
五、struct和union和區別
1.結構和聯合都是由多個不同的資料型別成員組成的,但是在任一時刻聯合只存放乙個被選中的成員,而結構的所有成員都存在。
2。對於聯合的不同成員賦值,將會對其他成員重寫,原來成員的值就不存在了,而對結構的不同成員賦值是會不影響的。
對聯合變數的賦值,都只能對變數的成員進行,乙個聯合變數每次只能賦值給乙個成員,乙個聯合變數的值就是當前聯合變數的某乙個成員值。
應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入乙個聯合變數內, 而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。
如果你想更好的提公升你的程式設計能力,學好c語言c++程式設計!彎道超車,快人一步!
【c語言c++學習企鵝圈子程式設計學習書籍:
C語言union關鍵字
union 關鍵字的用法與struct 的用法非常類似。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 union statemachin...
C語言union關鍵字
今天看union,不是很記得其作用了。本文摘自c語言中文網,解釋的很好,學到了東西。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 uni...
C語言union關鍵字
union 關鍵字的用法與struct 的用法非常類似。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 union statemachin...