聯合體union的使用

2021-07-07 10:42:37 字數 1395 閱讀 8754

1.聯合體union的基本特性——和struct的同與不同

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

不過區別也挺明顯:

結構體(struct)中所有變數是「共存」的——優點是「有容乃大」,全面;缺點是struct記憶體空間的分配是粗放的,不管用不用,全分配。

而聯合體(union)中是各變數是「互斥」的——缺點就是不夠「包容」;但優點是記憶體使用更為精細靈活,也節省了記憶體空間。

2.雙刃劍——多種訪問記憶體途徑共存

乙個例子了然:

[cpp]view plain

copy

//example

#include

union

var;  

main()  

結果:  

v.l is 5  

now v.l is 6! the address is 0xbfad1e2c  

now v.i is 6! the address is 0xbfad1e2c  

所以說,管union的叫共用體還真是貼切——完全就是共用乙個記憶體首位址,並且各種變數名都可以同時使用,操作也是共同生效。如此多的access記憶體手段,確實好用,不過這些「手段」之間卻沒法互相遮蔽——就好像陣列+下標和指標+偏移一樣。

上例中我改了v.i的值,結果v.l也能讀取,那麼也許我還以為v.l是我想要的值呢,因為上邊提到了union的記憶體首位址肯定是相同的,那麼還有一種情況和上邊類似:

乙個int陣列變數a,乙個long int(32位機中,long int佔4位元組,與int相同)變數b,我即使沒給int變數b賦值,因為資料型別相同,我使用int變數b也完全會拿出int陣列a中的a[0]來,一些時候一不小心用上,還以為用的就是變數b呢~

這種邏輯上的錯誤是很難找出來的(只有當資料型別相去甚遠的時候稍好,出個亂碼什麼的很容易發現錯誤)。

ps:感謝熱心網友的提醒「在union定義結束時加分號」,其實是可以不加的,因為他不在主函式內,不是執行的語句,如果是主函式內宣告的union就必須加分號了,在主函式內不加分號就涉及到基礎常識了——沒有分號隔開怎能叫一句。

3.聯合體union和大小端(big-endian、little-endian):

[cpp]view plain

copy

#include

union

var;  

intmain()  

結果:11020304

證明我的32位linux是小端(little-endian)

union聯合體使用詳解

1.聯合體 聯合體 union 與結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在聯合體中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。應該說 明的是,這裡所謂的共享不是指把多個成員同...

union聯合體使用詳解

1.聯合體 聯合體 union 與結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在聯合體中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。應該說 明的是,這裡所謂的共享不是指把多個成員同...

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...