一句话解释C语言struct与union的区别
当我用了将近2年C的时候,还是分不清楚什么是联合体(union)。根据教科书上笼统的解释:结构体和联合体之间最主要的区别就是:结构体的大小是结构体内各个元素大小的总和,而联合体的大小是联合体内体积最大的那个变量的大小。
随着对C语言理解的深入,我用一句话解释结构体与联合体。
如果存在结构体和一个联合体如下:
typedef struct MENU_AlcoholPlate
{
double Martini;
char Vodka;
int Champagne;
} AlcoholPlate;
typedef union MENU_CupOfAlcohol
{
double Martini;
char Vodka;
int Champagne;
} CupOfAlcohol;
结构体就是三个杯子一盘酒,而联合体:一个杯子三种酒。
结构体是一个服务员的餐盘,这个盘子内放着这家饭店的招牌酒水套餐,那就是:
一杯马提尼鸡尾酒
一杯伏特加
一杯香槟
当然,鸡尾酒由倒圆锥型的大高脚杯盛放,中间是一片墨绿色的橄榄叶。
伏特加呢不宜大口豪饮,则已圆柱形的小杯盛放。
椭圆形高脚杯不大不小,内乘上等香槟。
既然是套餐,那就三种酒非点不可,本店不单卖哟!
联合体就是牛场边木质棚屋内一个酒保手中普通的玻璃杯,偌大一个杯子,客官,请问您要点哪一种酒?
半品脱的伏特加?一品脱香槟?或是两品脱的马提尼?容量不等价位相同,本店薄利,就这一个杯子噢!
(如果您的左轮走火,打坏了杯子,可要照价赔偿)
int main()
{
double Martini = 43605.0213;
char Vodka = 255;
int Champagne = 0xAA55;
AlcoholPlate ComboOne;
CupOfAlcohol ANiceGlassCup;
ComboOne.Martini = Martini; // Ok!
ComboOne.Vodka = Vodka; // No problem!
ComboOne.Champagne = Champagne; // Fantastic!
ANiceGlassCup. Martini = Martini; // Bravo!
if (ANiceGlassCup.Vodka == 'C') // No! You can't do this! Because Martini has already in the cup!
return 1;
while (IMNotDunkYet)
{
DrinkingInTheHotel (AlcoholPlate);
DrinkingInABar (ANiceGlassCup);
}
return 0;
}
好了如果你理解上述内容,那么让我们干了这杯马提尼,吞下这烈火一般的伏特加,最后举起手中的香槟,今夜不醉不休! 理解,一个杯子不能同时装几种酒。
现在问题是你怎么知道联合体类型大小具有多少字节?装不同的酒,会不会溢出啊? 13*0217 发表于 2016-6-24 11:08
理解,一个杯子不能同时装几种酒。
现在问题是你怎么知道联合体类型大小具有多少字节?装不同的酒,会不会 ...
那么联合体类型的大小取决于联合体内可装最大元素的大小
比如在CupOfAlcohol联合体中,double类型所占空间最大
那么CupOfAlcohol联合体的大小就等于Martini,也就是一个double的大小。
在gcc 64中
sizeof(CupOfAlcohol) == 8
sizeof(double) == 8
如果联合体成这样呢?
typedef union MENU_CupOfAlcohol
{
double Martini[2];
char Vodka;
int Champagne;
} CupOfAlcohol;
那么:sizeof(CupOfAlcohol) == 16 cyycoish 发表于 2016-6-24 16:46
那么联合体类型的大小取决于联合体内可装最大元素的大小
比如在CupOfAlcohol联合体中,double类型所占空 ...
原来如此,恭喜你又上了个台阶。
页:
[1]