共用體有時(shí)也被稱為聯(lián)合或者聯(lián)合體瓤荔,這也是 Union 這個(gè)單詞的本意。
結(jié)構(gòu)體和共用體的區(qū)別在于:結(jié)構(gòu)體的各個(gè)成員會(huì)占用不同的內(nèi)存钥组,互相之間沒(méi)有影響输硝;而共用體的所有成員占用同一段內(nèi)存,修改一個(gè)成員會(huì)影響其余所有成員程梦。
結(jié)構(gòu)體占用的內(nèi)存大于等于所有成員占用的內(nèi)存的總和(成員之間可能會(huì)存在縫隙)点把,共用體占用的內(nèi)存等于最長(zhǎng)的成員占用的內(nèi)存。共用體使用了內(nèi)存覆蓋技術(shù)屿附,同一時(shí)刻只能保存一個(gè)成員的值郎逃,如果對(duì)新的成員賦值,就會(huì)把原來(lái)成員的值覆蓋掉拿撩。
共用體也是一種自定義類型衣厘,可以通過(guò)它來(lái)創(chuàng)建變量,例如:
union data{
int n;
char ch;
double f;
};
union data a, b, c;
上面是先定義共用體压恒,再創(chuàng)建變量影暴,也可以在定義共用體的同時(shí)創(chuàng)建變量:
union data{
int n;
char ch;
?double f;
} a, b, c;
如果不再定義新的變量,也可以將共用體的名字省略:
union{
int n;
char ch;
double f;
} a, b, c;
共用體 data 中探赫,成員 f 占用的內(nèi)存最多型宙,為 8 個(gè)字節(jié),所以 data 類型的變量(也就是 a伦吠、b妆兑、c)也占用 8 個(gè)字節(jié)的內(nèi)存,請(qǐng)看下面的演示:
純文本復(fù)制
#include <stdio.h>
union data{
?int n;
?char ch;
?short m;
};
int main(){
union data a;
printf("%d, %d\n", sizeof(a), sizeof(union data) );
a.n = 0x40;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.ch = '9';
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.m = 0x2059;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.n = 0x3E25AD54;
?printf("%X, %c, %hX\n", a.n, a.ch, a.m);
?return 0;}
運(yùn)行結(jié)果:
4, 4
40, @, 40
39, 9, 39
2059, Y, 2059
3E25AD54, T, AD54