技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 847|回复: 3
收起左侧

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

[复制链接]

85

主题

263

帖子

3437

积分

用户组: 管理员

No. 418

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

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

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

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

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

评分

参与人数 1威望 +1 贡献 +5 收起 理由
0xAA55 + 1 + 5 我感觉我思维跟不上你……

查看全部评分

本帖被以下淘专辑推荐:

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.

32

主题

171

帖子

1580

积分

用户组: 管理员

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

85

主题

263

帖子

3437

积分

用户组: 管理员

No. 418

UID
418
精华
13
威望
52 点
宅币
1969 个
贡献
1036 次
宅之契约
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.

32

主题

171

帖子

1580

积分

用户组: 管理员

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

原来如此,恭喜你又上了个台阶。

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-6-22 13:49 , Processed in 0.080824 second(s), 17 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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