@關於聯合體使用的一點心得
1.聯合體union
當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體(union)。在c programming language 一書中對於聯合體是這麼描述的:
1)聯合體是乙個結構;
2)它的所有成員相對於基位址的偏移量都為0;
3)此結構空間要大到足夠容納最"寬"的成員;
4)其對齊方式要適合其中所有的成員;
下面解釋這四條描述:
由於聯合體中的所有成員是共享一段記憶體的,因此每個成員的存放首位址相對於於聯合體變數的基位址的偏移量為0,即所有成員的首位址都是一樣的。為了使得所有成員能夠共享一段記憶體,因此該空間必須足夠容納這些成員中最寬的成員。對於這句「對齊方式要適合其中所有的成員」是指其必須符合所有成員的自身對齊方式。以上內容摘抄自
2.特性–多種訪問記憶體途徑共存
1
//example
2 #include
3union var;7
main()
15 結果:
16 v.l is 5
17 now v.l is 6
! the address is 0xbfad1e2c
18 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呢~
這種邏輯上的錯誤是很難找出來的(只有當資料型別相去甚遠的時候稍好,出個亂碼什麼的很容易發現錯誤)。以上內容摘抄自
先粘**
typedef
union system_faultbit;
}system_fault_struct;
這裡面我們可以了解到聯合裡面包含了乙個uint16的all變數,還有乙個結構體bit,裡面利用位帶操作把16 bit分別用作各種狀態量的表示,然後最精彩的用法來了~
volatile system_fault_struct gpsm_fault;
if( gpsm_fault.all !=0)
結合上面第二點聯合體成員就是共用乙個記憶體首位址的知識點,不知道大家看懂了嗎?
也就是說結構體裡面各個位若有狀態出現問題置1,那麼也就是說聯合體的記憶體空間裡面的值肯定不為零,那這時候訪問all變數也就是說肯定不會通過if的條件檢測。
也就是說你不再需要做十六個條件判斷,這樣你還可以不斷擴充套件,多少個狀態監測都可以輕鬆利用這個方法實現。
第一次發帖,有些認識可能不到位,希望大家多多指教~~~~
C語言中聯合體union的使用
本文編輯整理自 一 前言 聯合體 union 與 結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和 而在 聯合 中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度 應該說明的是,這裡所謂的共享不...
C語言中聯合體union的使用
一 前言 聯合體 union 與 結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和 而在 聯合 中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度 應該說明的是,這裡所謂的共享不是指把多個成員同...
C 中聯合體(union)的使用
1 typedef union para 2np 11 npara 12 或者如下所示 13union para 14np 23 24typedef union para npara 2526 詳細可以參看typedef的用法,本文主要講解union的用法,不再贅述 union聯合體的用法 例如利用...