union 和 struct 的區別與聯絡

2021-06-22 14:12:29 字數 1573 閱讀 6579

union ( 共用體):構造資料型別,也叫聯合體 

用途:使幾個不同型別的變數共佔一段記憶體(相互覆蓋)

struct ( 結構體 ):是一種構造型別

用途: 把不同的資料組合成乙個整體——自定義資料型別

主要區別:

1. struct和union都是由多個不同的資料型別成員組成, 但在任何同一時刻, union中只存放了乙個被選中的成員; 而struct的所有成員都存在。在struct中,各成員都占有自己的記憶體空間,它們是同時存在的,乙個struct變數的總長度等於所有成員長度之和,遵從位元組對其原則; 在union中,所有成員不能同時占用它的記憶體空間,它們不能同時存在 , union變數的長度等於最長的成員的長度。

2. 對於union的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了,所以,共同體變數中起作用的成員是最後一次存放的成員; 而對於struct的不同成員賦值是互不影響的。

union 維護足夠的空間來置放多個資料成員中的「一種」,而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下:

union statemachine

;乙個union 只配置乙個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double 型態,所以statemachine 的空間大小就是double 資料型別的大小。

在c++裡,union 的成員預設屬性頁為public。union 主要用來壓縮空間。如果一些資料不可能在同一時間同時被用到,則可以使用union。

下面再看乙個例子:

union

*p, u;

p =&u;

p->a[0] = 0x39;

p->a[1] = 0x38;

p.i 的值應該為多少呢?

這裡需要考慮儲存模式:大端模式和小端模式。

union 型資料所佔的空間等於其最大的成員所佔的空間。對union 型的成員的訪問都是相對於該聯合體基位址的偏移量為0 處開始,也就是聯合體的訪問不論對哪個變數的訪問都是從union 的首位址位置開始。如此一解釋,上面的問題是否已經有了答案呢?

上述問題似乎還比較簡單,那來個有技術含量的:請寫乙個c 函式,若處理器是big_endian 的,則返回0;若是little_endian 的,則返回1。

先分析一下,按照上面關於大小端模式的定義,假設int 型別變數i 被初始化為1。

以大端模式儲存,其記憶體布局如下圖:

以小端模式儲存,其記憶體布局如下圖:

變數i 佔4 個位元組,但只有乙個位元組的值為1,另外三個位元組的值都為0。如果取出低位址上的值為0,毫無疑問,這是大端模式;如果取出低位址上的值為1,毫無疑問,這是小端模式。既然如此,我們完全可以利用union 型別資料的特點:所有成員的起始位址一致。

int checksystem( )

c;c.i = 1;

return (c.ch ==1); }

現在你可以用這個函式來測試你當前系統的儲存模式了。當然你也可以不用函式而直接去檢視記憶體來確定當前系統的儲存模式。如下圖:

圖中0x01 的值存在低位址上,說明當前系統為小端模式

Struct 和 Union 的詳細區別

union 共用體 struct 結構體 兩者的區別 1 共用體和結構體都是由多個不同的資料型別成員組成,但在任何同一時刻,共用體只存放乙個被選中的成員,而結構體則存放所有的成員變數。2 對於共用體的不同成員賦值,將會對其他成員重寫,原來成員的值就不存在了,而對於結構體的不同成員賦值是互不影響的 3...

Union和struct的記憶體分配區別

今天看到有一段程式裡在struct裡面用了個union,然後就突然想到了struct和union的區別,找了些資料後發現,struct和union在記憶體分配的時候有區別,union裡的資料是公用一塊記憶體 所以給其分配的記憶體總是union裡面所定義的最大型別長度的整數倍。而struct裡的資料跟...

union和struct的區別 大小端

struct中的每個域在記憶體中都獨立分配空間 union只分配最大域的空間,所有域共享這個空間 include structa union b int main union的使用受系統大小端的影響 c.c 1為小端,0為大端 剖析 little endian模式的cpu對運算元的存放方式是從低位元...