C語言之聯合體

2021-09-25 07:49:48 字數 1446 閱讀 6894

聯合體,就是將幾種資料型別聯合起來的一種資料結構,但是它們共用乙個空間。

怎麼理解呢?川劇變臉見過沒,就是來來回回的變來變去,給人看的眼花繚亂的,但是不管你怎麼變,面具下的臉卻始終不變。同樣的道理,各種資料型別就是各種臉譜,對外展現了不同的形象,唯一不變的就是它的記憶體空間的二進位制資料始終都是一樣的,它們占用的空間也是同乙個地方,只是這些二進位制資料當你把它看成浮點型的時候,它是浮點數;當你把它看成無符號整數的時候,就是無符號數,或者你把這些資料看成有符號的資料,那麼它就是有符號資料。

比如上面的,同樣的**,因為顯示的時候採用不同的方式(面具),所以看起來不一樣,但實際上它的十六進製制數也是一樣的,通過兩個整型資料就可以看出來,都是 0xc0b0 0000。實際上浮點資料 5.5 深入去看的話,也一定是 0xc0b0 0000,只是這裡沒辦法看到罷了。實際上我們可以直接通過記憶體位址 0x2000 0010(上圖可以看到這個位址)觀察資料的,可以看下圖:

可以看到,這個位址周圍只有乙個 0xc0b0 0000,相連的幾個資料都是 0 ,這也間接的說明了浮點 5.5 在記憶體中存的就是這個值(關於浮點數的訪問,我會單獨用一小節講述)。

再比如乙個 24 bit 表示的畫素點,由 red,green,blue 三種顏色組成(由這三種顏色可以組成任一種看到的顏色),每種顏色 8 bit,但是有時候他們又可以進行組合,組合乙個代表畫素點的值,這時就可以使用聯合體。

這裡就是乙個聯合體的宣告(關於 typedef 關鍵字,看c語言之型別定義(typedef),關於 struct 關鍵字,看c語言之結構體(struct))。這裡可以看到,這個聯合體裡包含了乙個結構體和乙個無符號整型資料。當需要某一種顏色資料時就呼叫這個顏色的值,而當需要整個畫素的值時就呼叫 value 就可以了。

如下:現在知道怎麼使用了,現在看看記憶體是怎樣的:

可以看到,這個聯合體共佔 4 位元組空間,它既可以表示 value,也可以修改其中的 red、green、blue。但是也能發現這裡還有乙個空閒的 1 個位元組,這是因為 value 為四位元組,所以只能按照最大的空間申請記憶體空間(聯合體占用的記憶體空間總是等於當中最大的乙個資料型別的大小)。

現在再來理解一下前面的**,一開始設定 value 的值,此時因為占用的是一塊記憶體空間,所以就會同時更改 red、green、blue。value 賦值為 0x0020 3040,按照小端儲存方式,red = 0x40,green = 0x30,blue = 0x20。

當修改 blue 的值時,只有 blue 改變了,變為 0x10,又因為他們共用乙個空間,所以 value 也跟著改變了。

所以利用這種特性,在資料傳輸的時候,就可以對資料進行拆分(當然也可以採用強制轉換的辦法,另說),比如將乙個四位元組的 int 資料,拆分為四個 unsigned char,或者將乙個浮點數拆分為 unsigned char 用於位元組傳輸傳送。

而如果 r、g、b 這種結構體型別可能其他地方需要用到,那麼就可以將這種結構體宣告放到聯合體外面使用,然後把它當成一種新的資料型別和整型資料聯合,效果是一樣的。

C語言之聯合體Union

共用體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義乙個帶有多成員的共用體,但是任何時候只能有乙個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。定義共用體union 為了定義共用體,您必須使用union語句,方式與定義結構類似。union 語句定義了乙個新...

c語言 union聯合體

linux中聯合體union實現判斷little endian 和 big endian 大端和小端 1 聯合體的資料成員從低位元組開始對齊 2 little endian 和 big endian。little endian 和 big endian 是 cpu 存放資料的兩種不同順序。對於整型 ...

C語言聯合體union

c語言中的聯合體union 在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int ma...