cyycoish 发表于 2016-6-21 00:14:14

一句话解释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:53

理解,一个杯子不能同时装几种酒。
现在问题是你怎么知道联合体类型大小具有多少字节?装不同的酒,会不会溢出啊?

cyycoish 发表于 2016-6-24 16:46:58

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

13*0217 发表于 2016-6-25 11:06:52

cyycoish 发表于 2016-6-24 16:46
那么联合体类型的大小取决于联合体内可装最大元素的大小
比如在CupOfAlcohol联合体中,double类型所占空 ...

原来如此,恭喜你又上了个台阶。
页: [1]
查看完整版本: 一句话解释C语言struct与union的区别