union(聯合體 結構體)的簡介與使用

2021-09-23 15:25:27 字數 3026 閱讀 5448

以前在學習c語言或c++的時候,只學習了一些常用的語法。對於一些少見的本著後面遇到了再來學的目的,就沒有去學習過。

今天早上看群裡面有人問,float怎麼轉換為4個位元組。我一想,這不是我以前做協議解析時候的問題嗎,當時我是用指標強制轉換的方法去實現的。方法就像下面那**片段一樣。

//轉換float資料到位元組陣列

unsigned char i;

float floatvariable;

unsigned char chararray[4];

(unsigned char) *pdata = ((unsigned char)*)&floatvariable;  //把float型別的指標強制轉換為unsigned char型

for(i=0;i<4;i++)

//轉換位元組陣列到float資料

float   floatvariable;

unsigned char  i; 

void   *pf;     

pf = &floatvariable; 

(unsigned char) * px = chararray;  

for(i=0;i<4;i++)

下面開始正文,上面全是白扯。。。

union 叫共用體,又叫聯合、聯合體。「聯合體」是一種特殊的類,也是一種構造型別的資料結構。在乙個「聯合體」內能夠定義多種不同的資料型別。乙個被說明為該「聯合體」型別的變數中。同意裝入該「聯合體」所定義的不論什麼一種資料。這些資料共享同一段記憶體,以達到節省空間的目的。

說了這麼多,到底什麼是聯合體呢,就是在這個資料結構內,會有多種不同的資料,這些資料共同擁有同一段記憶體。。。好吧,可能感覺還不是很懂。看下面的**片段,你可能就懂了。

typedef struct

rgb_typedef;

typedef union

pix_typedef;

這就宣告了乙個結構體和乙個聯合體,聯合體內部包含了乙個結構體和乙個無符號整形資料(32位的)。剛剛我們說了聯合體內部的資料共享同一段記憶體,意思就是說聯合體內部的結構體的首位址和無符號整形資料的首位址是相同的,不信?你看下面的片段。

#include "stdio.h"

typedef struct

rgb_typedef;

typedef union

pix_typedef;

void main()

執行結果截圖:

可以清晰的看到,聯合體裡面的結構體和無符號整形資料是相同的。

我們知道了聯合體的功能了,那麼到底會有一些怎麼樣的應用呢?

我們都知道rgb三原色是有紅、綠、藍各佔乙個位元組(0-255)表示的,有些時候,我們需要單獨去r、g、b三個色值,有些時候,又需要合在一起使用。難道我們每一次使用的時候,都對資料進行拆分、融合?這樣實在是太麻煩了。我們就可以利用聯合體的方式來定義三原色。

宣告乙個結構體包含三原色,然後在宣告乙個聯合體包含前乙個結構體和三原色融合的數值。如下圖所示。

typedef struct

rgb_typedef;

typedef union

pix_typedef;

如果我們定義三原色分別為0x11、0x22、0x33,然後不再做任何處理,直接列印value。會是怎麼一種情況。**如下

#include "stdio.h"

typedef struct

rgb_typedef;

typedef union

pix_typedef;

void main()

執行結果如下圖:

這裡需要說明一下的是,unsigned int 是乙個4位元組資料,而前面我們只定義了三個unsigned char ,只佔三個位元組。所以msb自動補齊了。在union中,分配記憶體空間的大小,等於佔記憶體最大的資料型別位元組大小。

在上面,我們已經看到可以直接通過定義r、g、b值,來修改融合後的值。當然,反過來也是可以的。我們首先對value賦值,然後再輸出r、g、b值。**如下:

#include "stdio.h"

typedef struct

rgb_typedef;

typedef union

pix_typedef;

void main()

執行結果如下圖:

由此,可以說明,無論是修改結構體,還是修改unsigned int ,都會對對方造成影響。因為他們是共享同一段記憶體

上面講了union在三原色中的應用,現在我們繼續來講如何利用union來做flaot 和 byte 之間的轉換。

首先在union當初定義乙個unsigned char 型別的陣列,元素為4個,在定義乙個float 型別資料。然後再對陣列中的每乙個元素進行賦值,最後直接列印float資料。**如下:

#include "stdio.h"

typedef union

float_byte;

void main()

執行結果如圖:

由此可見,用union來做float與byte轉換時完全可行,甚至簡單的。只需要注意好記憶體對齊。

有點累了,今天起的太早,睡個午覺。。。。。。

謝謝各位的閱讀

結構體與聯合體

結構體和聯合體 圖見筆記 一.結構體概念 結果虛擬記憶體 對映到物理記憶體 二.結構體長度 三.結構體陣列 指標陣列 四.簡易通訊錄 定義開始頁面 區域性函式 1.增加使用者資訊 2.修改使用者資訊 3.查詢資訊 4.刪除資訊 5.顯示資訊 6.執行 五.聯合體的概念 結果六.判斷大小端 面試 七....

結構體與聯合體

目錄結構 聯合 區別 結構 是一種構造型別,它是由若干 成員 組成的。每乙個成員可以是乙個基本資料型別或者是另乙個構造型別。結構在說明和使用之前必須先定義。格式 struct 結構名 結構變數 結構名是結構的識別符號。結構成員的型別可以為整型 浮點型 字元型 指標型等資料型別,或者是另乙個構造型別。...

結構體聯合體

在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...