共用體又叫聯合,因為它的關鍵字是union,它的使用不像列舉和結構體那麼頻繁,但是作為c語言中一種資料型別,我們也有必要弄清它的用法.
從前面的分析,我們知道結構體的總長度等於所有成員的和(當然還可能遇到記憶體對齊問題),
共用體剛好與結構體不同,
共用體所有成員共用一塊記憶體
,順序從低位址開始存放,
一次只能使用其中乙個成員
,union最終大小由共用體中最大的成員決定,
對某一成員賦值可能覆蓋另乙個成員
這裡需要解釋:為什麼t.a = -114,t.b=460420494,t.c=520.131400
而不是 t.a = 97,t.b =10; 當然t.c等於520.131400並不奇怪
1.共用體其實每次只能使用其中乙個成員,對於上面的**經過三次賦值,最終使用的其實就是t.c,
而通過上面的輸出結果,我們也確實看到t.c是有效的。
2.共用體有乙個特點就是它的成員儲存在同一塊記憶體區域,這塊區域的大小需要根據它的成員中長度最大的成員長度而定。
由於上面的**是64位編譯器編譯的:
char 1 位元組
int 4 位元組
double 8位元組
所以type長度為8.
(以下都是數字都是二進位制,由於表抽風,將就一下):又根據上面輸出的位址,可以得到下面的儲存資訊(注意資料的儲存方式:高位址儲存高位,低位址儲存地位):
當讀取c的時候,它的二進位制「64,96,128,128,128,64」,換算成十進位制520;
因為經過三次賦值,此時的b的長度是4,儲存的時候被c的成員地位資料覆蓋(64,96,128,128把,1,2,3,4,覆蓋了)。換算成十進位制就是460420494。
a也是一樣意思被c覆蓋了,所以換成十進位制就是-114。
總結:1.一次只能使用其中乙個成員賦值,否則長度大的,會把長度低的覆蓋.
C語言構造型別之共用體與列舉
常用於 查詢 定義 關鍵字 union 共用體名 模擬結構體 關鍵字struct 結構體名 共用體的記憶體大小只和最大的元素大小有關 共用體大部分操作和結構體一樣 共用體依然可以使用位元組對齊和位域 pragma pack 1 union message 關鍵字enum 列舉名 列舉本質為正整數型別...
語言 構造型別(結構體 列舉)
42.構造型別 構造資料型別 陣列型別 結構體型別 共用體 聯合 型別。43.結構體 結構 是一種構造型別,它是由若干 成員 組成的。每乙個成員可以時乙個基本資料型別或者又是乙個構造型別。結構體可以把功能相同的資料組織起來,存在一起,用的時候方便,而且在呼叫函式時,若傳遞引數較多,傳乙個結構體相對而...
構造型別及結構體
1 構造型別及結構體 a c語言構造型別 構造資料型別 構造資料型別是根據已定義的乙個或多個資料型別用構造的方法來定義的。也就是說,乙個構造型別的值可以分解成若干個 成員 或 元素 每個 成員 都是乙個基本資料型別或又是乙個構造型別。在c語言中,構造型別有以下幾種 陣列型別 結構體型別 共用體 聯合...