嵌入式學習筆記:c語言(yan)共用體(ti)和結構體(ti)的區別(bie)
時間(jian):2018-09-06 來源:未(wei)知
c++中(zhong),結構(gou)體(ti)(ti)(struct)和共(gong)用(yong)體(ti)(ti)(union)是比較相似的(de)復(fu)合數據類型,這兩(liang)個都是用(yong)來(lai)存儲多種數據的(de),但是他們(men)之(zhi)間還是有很(hen)大差距(ju)的(de),一起來(lai)了解(jie)
【1】共用體
(1)共(gong)用(yong)體的概念
在 C 語言中,不同(tong)數據類型的數據可以使用共同(tong)的存儲(chu)區域(yu),這種數據構(gou)造類型稱(cheng)為共用體(ti),簡稱(cheng)共用,又稱(cheng)聯合體(ti)。
共用體(ti)在(zai)定義、說明和使用形式(shi)上(shang)與結構(gou)體(ti)相似(si)。兩(liang)者本質上(shang)的(de)不同僅在(zai)于使用內存的(de)方式(shi)上(shang)。
定義一個(ge)共用體類型的一般形(xing)式為:
union 共用體名
{
成員表列;
};
例如:
union gy
{
int i; char c; float f;
};
這里(li)定義了(le)一個(ge)共(gong)用體類(lei)型 union gy,它由(you)三個(ge)成(cheng)員(yuan)組成(cheng),這三個(ge)成(cheng)員(yuan)在內存中(zhong)使用共(gong)同的存儲空間。
由(you)于共(gong)用(yong)(yong)(yong)體中各成(cheng)(cheng)員的(de)數據長度往往不同,所以(yi)共(gong)用(yong)(yong)(yong)體變量在存儲時(shi)總是按(an)其成(cheng)(cheng)員中數據長度最大(da)的(de)成(cheng)(cheng)員占用(yong)(yong)(yong)內(nei)存空間。
在這一點上共(gong)用(yong)體(ti)與結構體(ti)不同,結構體(ti)類型變量在存儲時(shi)總是按各成員的數據長度之和(he)占用(yong)內存空間。
例(li)如,定義了一個結(jie)構(gou)體類(lei)型:
struct gy
{
int i;
char c;
float f;
};
則結構體類型 struct gy 的變量占用的內存大小為 2+1+4=7 個字節(不考慮(lv)字節對齊)。
在使用(yong)共(gong)用(yong)體(ti)類型變量的(de)數(shu)據時要注(zhu)意:在共(gong)用(yong)體(ti)類型變量中起作用(yong)的(de)成員是(shi)最后(hou)一次存(cun)放的(de)成員,
在存入一個新的成員(yuan)后(hou)原有(you)的成員(yuan)就失去作用。如(ru)有(you)以下(xia)賦(fu)值(zhi)語句:
a.i = 1;
a.c = ’a’;
a.f = 1.5;
完(wan)成以上三個賦值運算以后,a.f 是有效的,a.i 和 a.c 已經無意義了。
在程序中經常使(shi)用結構(gou)體與(yu)共用體相互嵌(qian)套的形(xing)式(shi)。
即共用體類(lei)(lei)型的成員可(ke)以是(shi)結構體類(lei)(lei)型,或(huo)者(zhe)結構體類(lei)(lei)型的成員是(shi)共用體類(lei)(lei)型。
例如,下列結(jie)構體類型 datas 的第三個(ge)成員是(shi)共用(yong)體類型:
struct datas
{
char *ps;
int type;
union
{
float fdata;
int idata;
char cdata;
}udata;
};
【2】typedef
(1)在 C 語言(yan)中,允許(xu)使用關鍵字 typedef 定義新(xin)的數據類型
其語(yu)法如下:
typedef
<已有(you)數據類(lei)型>
<新數據類型>;
如:
typedef int INTEGER;
這(zhe)里新定義了數據類型 INTEGER, 其(qi)等價(jia)于 int
INTEGER i; <==> int i;
(2) 在 C 語(yu)言中經常在定義結構體(ti)類型時使用(yong) typedef,例如
typedef
{
struct _node_
int data;
struct _node_ *next;
} listnode, *linklist;
這里(li)定義了兩個新的數據(ju)類型 listnode 和 linklist。其中 listnode 等(deng)價于數據(ju)類型 struct _node_ 而 linklist 等(deng)價于 struct _node_ *
【3】

