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