c++中,結構體(struct)和共用體(union)是比較相似的復合數據類型,這兩個都是用來存儲多種數據的,但是他們之間還是有很大差距的,一起來了解
【1】共用體
(1)共用體的概念
在 C 語言中,不同數據類型的數據可以使用共同的存儲區域,這種數據構造類型稱為共用體,簡稱共用,又稱聯合體。
共用體在定義、說明和使用形式上與結構體相似。兩者本質上的不同僅在于使用內存的方式上。
定義一個共用體類型的一般形式為:
union 共用體名
{
成員表列;
};
例如:
union gy
{
int i; char c; float f;
};
這里定義了一個共用體類型 union gy,它由三個成員組成,這三個成員在內存中使用共同的存儲空間。
由于共用體中各成員的數據長度往往不同,所以共用體變量在存儲時總是按其成員中數據長度最大的成員占用內存空間。
在這一點上共用體與結構體不同,結構體類型變量在存儲時總是按各成員的數據長度之和占用內存空間。
例如,定義了一個結構體類型:
struct gy
{
int i;
char c;
float f;
};
則結構體類型 struct gy 的變量占用的內存大小為 2+1+4=7 個字節(不考慮字節對齊)。
在使用共用體類型變量的數據時要注意:在共用體類型變量中起作用的成員是最后一次存放的成員,
在存入一個新的成員后原有的成員就失去作用。如有以下賦值語句:
a.i = 1;
a.c = ’a’;
a.f = 1.5;
完成以上三個賦值運算以后,a.f 是有效的,a.i 和 a.c 已經無意義了。
在程序中經常使用結構體與共用體相互嵌套的形式。
即共用體類型的成員可以是結構體類型,或者結構體類型的成員是共用體類型。
例如,下列結構體類型 datas 的第三個成員是共用體類型:
struct datas
{
char *ps;
int type;
union
{
float fdata;
int idata;
char cdata;
}udata;
};
【2】typedef
(1)在 C 語言中,允許使用關鍵字 typedef 定義新的數據類型
其語法如下:
typedef
<已有數據類型>
<新數據類型>;
如:
typedef int INTEGER;
這里新定義了數據類型 INTEGER, 其等價于 int
INTEGER i; <==> int i;
(2) 在 C 語言中經常在定義結構體類型時使用 typedef,例如
typedef
{
struct _node_
int data;
struct _node_ *next;
} listnode, *linklist;
這里定義了兩個新的數據類型 listnode 和 linklist。其中 listnode 等價于數據類型 struct _node_ 而 linklist 等價于 struct _node_ *
【3】