union,中文名“聯合體、共用體”,在某種程度上類似結構體struct的一種資料結構,共用體(union)和結構體(struct)同樣可以包含很多種資料型別和變數,
但在“聯合”中, 各成員共享一段記憶體空間, 一個聯合變數的長度等于各成員中最長的長度 ,一個聯合體型別必須經過定義之后, 才能使用它,才能把一個變數宣告定義為該聯合體型別,
當定義結構物件時,如果沒有顯式地初始化它們,則會采用一般初始化規則:如果該結構物件屬于動態存盤型別,那么其成員具有不確定的初始值,
另一方面,如果結構物件具有靜態存盤周期,那么其非指標成員初始值是 0,其指標成員初始值是空指標,
不同于結構成員——它們在結構中都具有單獨的記憶體位置,聯合成員則共享同一個記憶體位置,也就是說,聯合中的所有成員都是從相同的記憶體地址開始,因此,可以定義一個擁有許多成員的聯合,但是同一時刻只能有一個成員允許含有一個值,聯合讓程式員可以方便地通過不同方式使用同一個記憶體位置,

一、定義聯合(union)
聯合的定義方式與結構是一樣的,只是把關鍵字 struct 改成 union:
union [標簽名稱]{成員宣告串列};
下面的例子定義了一個名為Data的聯合型別,它有 3 個成員:i、x 和 str:
union Data { int i;double x;char str [16];};
這種型別的物件可以存盤一個整數、一個浮點數或一個短字串,
例如:
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一個union 只配置一個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double 型態,所以StateMachine 的空間大小就是double 資料型別的大小,
在C++里,union 的成員默認屬性頁為public,union 主要用來壓縮空間,如果一些資料不可能在同一時間同時被用到,則可以使用union,
二、初始化聯合(union)
與結構類似,通過初始化串列(initialization list)來初始化聯合物件,但是,對聯合來說,串列只有一個初始化器(initializer),
與結構一樣,C99 允許在初始化器中使用成員指示符來指示哪個成員被初始化,而且,如果初始化器沒有成員指示符,那么就與聯合內的第一個成員關聯,具有自動存盤類的聯合物件也可以使用已有的同型別物件來初始化,下面是一些初始化例子:
union Data var1={77},
var2={.str="Mary"},
var3=var1,
myData[100]={{.x=0.5},{1},var2};
陣列 myData 中的元素如果沒有指定初始化器,會被隱式地初始化為 0 值,
三、聯合體變數的宣告
聯合變數的說明和結構變數的宣告方式相同, 也有三種形式:
第一種 , 先定義聯合體型別,再宣告聯合體變數 ;
第二種 ,定義聯合體型別的同時宣告聯合體變數;
第三種 ,直接宣告聯合體(以匿名的形式定義聯合體型別),
以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
{
int class;
char office[10];
}a,b
經說明后的a,b變數均為perdata型別,a,b變數的長度應等于 perdata 的成員中最長的長度, 即等于office陣列的長度,共10個位元組,對a,b變數如賦予整型值時,只使用了2個位元組,而賦予字符陣列時,可用10個位元組,
四、聯合體變數的賦值和使用
對聯合體變數的賦值,使用都只能是對變數的成員進行,
聯合變數的成員表示為: 聯合變數名 . 成員名
例如,a被說明為perdata型別的變數之后,可使用 a.class,a.office
不允許只用聯合變數名作賦值或其它操作, 也不允許對聯合變數作初始化賦值,賦值只能在程式中進行,
一個聯合體變數, 每次只能賦予一個成員值,一個聯合變數的值就是聯合變員的某一個成員值,
五、struct和union和區別
1.結構和聯合都是由多個不同的資料型別成員組成的,但是在任一時刻聯合只存放一個被選中的成員,而結構的所有成員都存在,
2,對于聯合的不同成員賦值,將會對其他成員重寫,原來成員的值就不存在了,而對結構的不同成員賦值是會不影響的,
對聯合變數的賦值,都只能對變數的成員進行,一個聯合變數每次只能賦值給一個成員,一個聯合變數的值就是當前聯合變數的某一個成員值,
應該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯合變數內, 而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值,

如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
【C語言C++學習企鵝圈子】,分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍:

編程學習視頻:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257329.html
標籤:其他
上一篇:設計模式(十五)——命令模式(Spring框架的JdbcTemplate原始碼分析)
下一篇:內部類
