像結構體一樣,聯合體也是由一個或者多個成員組成,這些成員可以是不同的類型。
聯合體類型的聲明
編譯器只為最?的成員分配?夠的內存空間。聯合體的特點是所有成員共?同?塊內存空間。所以聯合體也叫:共?體。
輸出結果:
聯合體的特點
- 給聯合體其中?個成員賦值,其他成員的值也跟著變化。
- 聯合的成員是共?同?塊內存空間的,這樣?個聯合變量的??,?少是最?成員的??(因為聯合?少得有能?保存最?的那個成員)。
1、那么如果給聯合體的其中一個成員賦值,其他成員是否會發生變化呢,我們通過實驗證明。
輸出結果:
如上圖所示,如果給聯合體的其中一個成員賦值,其他成員的值會發生變化。
2、那么結構體的成員是否真的共用同一塊內存空間呢,我們通過實驗進行證明:
輸出結果:
從輸出結果可以看到,無論是整個聯合體的地址,還是聯合體中成員的地址,都是用的同一塊存儲空間。
聯合體大小的計算
- 聯合的???少是最?成員的??。
- 當最?成員??不是最?對?數的整數倍的時候,就要對?到最?對?數的整數倍。
例如:
在聯合體中創建一個包含5個元素的字符數組和一個整型變量,計算聯合體內存空間大小。

輸出結果:

實際上,這里很多人會誤以為聯合體所占用的空間是5個字節,實際上,5個字節確實是聯合體內最大的成員,但是聯合體內最大的對齊數是4,5個字節只是由5個char類型組成, 本質上對齊數還是1,而 聯合體的總大小為聯合體內最大對齊數的倍數,所以聯合體的總大小為8個字節.
相同成員變量的結構體和聯合體對比
下面我們通過一幅圖,來計算結構體和聯合體各自所占的內存空間大小。
輸出結果:
從輸出結果可以看出,結構體和聯合體還是有一定區別的。
聯合體的實際應用
1、使?聯合體是可以節省空間的,?如,我們要搞?個活動,要上線?個禮品兌換單,禮品兌換單中有三種商品:圖書、杯?、襯衫。每?種商品都有:庫存量、價格、商品類型和商品類型相關的其他信息。
- 圖書:書名、作者、?數
- 杯?:設計
- 襯衫:設計、可選顏?、可選尺?
如果我們沒有經過思考,就會寫出下面的結構體:
上述的結構其實設計的很簡單,?起來也?便,但是結構的設計中包含了所有禮品的各種屬性,這樣使得結構體的??就會偏?,?較浪費內存。
經過處理后的結構體:
因為對于禮品兌換單中的商品來說,只有部分屬性信息是常?的, 所以我們就可以把公共屬性單獨寫出來,剩余屬于各種商品本?的屬性使?聯合體起來,這樣就可以減少 所需的內存空間,?定程度上節省了內存。
如圖所示:

2、 寫?個程序,判斷當前機器是?端字節序?還是?端字節序?
首先,我們在函數中創建一個聯合體,包含整型和字符型兩個成員變量,然后將整型變量賦值為1,最后返回字符型變量,由于聯合體共用一塊內存空間,若返回的是0,則為大端字節序,若返回的是1,則為小端字節序。

輸出結果:

由輸出結果可知,當前電腦為小端字節序。