C語言丨關鍵字union的定義和使用

2022-06-05 06:57:08 字數 3078 閱讀 3063

union,中文名「聯合體、共用體」,在某種程度上類似結構體struct的一種資料結構,共用體(union)和結構體(struct)同樣可以包含很多種資料型別和變數。

但在「聯合」中, 各成員共享一段記憶體空間, 乙個聯合變數的長度等於各成員中最長的長度 。乙個聯合體型別必須經過定義之後, 才能使用它,才能把乙個變數宣告定義為該聯合體型別。

當定義結構物件時,如果沒有顯式地初始化它們,則會採用一般初始化規則:如果該結構物件屬於動態儲存型別,那麼其成員具有不確定的初始值。

另一方面,如果結構物件具有靜態儲存週期,那麼其非指標成員初始值是 0,其指標成員初始值是空指標。

不同於結構成員——它們在結構中都具有單獨的記憶體位置,聯合成員則共享同乙個記憶體位置。也就是說,聯合中的所有成員都是從相同的記憶體位址開始。因此,可以定義乙個擁有許多成員的聯合,但是同一時刻只能有乙個成員允許含有乙個值。聯合讓程式設計師可以方便地通過不同方式使用同乙個記憶體位置。

一、定義聯合(union)

聯合的定義方式與結構是一樣的,只是把關鍵字 struct 改成 union:

union [標籤名稱];

下面的例子定義了乙個名為data的聯合型別,它有 3 個成員:i、x 和 str:

union data ;

這種型別的物件可以儲存乙個整數、乙個浮點數或乙個短字串。

例如:

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=,

var2=,

var3=var1,

mydata[100]=,,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++學習企鵝圈子程式設計學習書籍:

C語言union關鍵字

union 關鍵字的用法與struct 的用法非常類似。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 union statemachin...

C語言union關鍵字

今天看union,不是很記得其作用了。本文摘自c語言中文網,解釋的很好,學到了東西。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 uni...

C語言union關鍵字

union 關鍵字的用法與struct 的用法非常類似。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 union statemachin...