找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4213|回复: 3

一句话解释C语言struct与union的区别

[复制链接]

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2016-6-21 00:14:14 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
当我用了将近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;
}

好了如果你理解上述内容,那么让我们干了这杯马提尼,吞下这烈火一般的伏特加,最后举起手中的香槟,今夜不醉不休!

本帖被以下淘专辑推荐:

In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复

使用道具 举报

37

主题

153

回帖

2008

积分

用户组: 超级版主

UID
8
精华
1
威望
14 点
宅币
1761 个
贡献
24 次
宅之契约
0 份
在线时间
279 小时
注册时间
2014-1-27
发表于 2016-6-24 11:08:53 | 显示全部楼层
理解,一个杯子不能同时装几种酒。
现在问题是你怎么知道联合体类型大小具有多少字节?装不同的酒,会不会溢出啊?
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 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
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

37

主题

153

回帖

2008

积分

用户组: 超级版主

UID
8
精华
1
威望
14 点
宅币
1761 个
贡献
24 次
宅之契约
0 份
在线时间
279 小时
注册时间
2014-1-27
发表于 2016-6-25 11:06:52 | 显示全部楼层
cyycoish 发表于 2016-6-24 16:46
那么联合体类型的大小取决于联合体内可装最大元素的大小
比如在CupOfAlcohol联合体中,double类型所占空 ...

原来如此,恭喜你又上了个台阶。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-25 19:06 , Processed in 0.047535 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表