首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【答疑解惑】如何玩转C语言联合体赋值?

【答疑解惑】如何玩转C语言联合体赋值?

作者头像
程序员互动联盟
发布2018-03-14 15:38:22
1.7K0
发布2018-03-14 15:38:22
举报

问题:C语言中的联合类型该如何赋值?

有C语言初学者朋友在群里做练习时对联合体进行赋值时发生编译错误,截图如下:

该联合体一个是int型,一个是float型的。从截图上看到,该群友还没有真正理解联合体类型的实际意义。

什么是联合体 我们知道一个变量其实就是用一个名字来表示一个存储单元。但是在一些编程场景下,有时候需要几种不同类型变量存放到同一段内存开始的单元中,就是在一些时候,这个内存单元叫名字a,用于存放类型a的数据;另一个时候叫名字b,用于存储类型b的数据,而a和b可能类型完全不一样。这种不同变量占用共同一段内存的情况其实就是共同体,也叫联合体。

联合体的定义 联合体需要以union作为关键字开始,比如下面定义了一个联合体un: union { int i; char c; }ic; 以上的变量ic就是一个联合体,联合体中的类型其实都是独立的,是i的时候,就整个都是i,跟c没有任何关系;同样当这个变量表示c时就只有一个c,没有任何i出现!

为什么会出现联合体 联合体是为了编程的统一性而出现的,兼备节省内存,其本质就是在某段地址开始处,不同时候将其解释成不同的数据类型。正因为这样,所以一般情况下,在同一时刻,不能同时看成是两种类型,只能是其中一种。比如在学校,有的是党员,的人是团员,有的啥都不是(也就是群众),但在定义一个学校人员的数据结构时,其中就会有一项政治面貌,这个不能把三个都定义进去,因为每一个人同时只会有一种政治面貌,于是定义一个联合体叫政治面貌,其中可能的值就是党员,团员或者群众。

联合体的大小

通过以上分析我们可以得出结论,联合类型中的所有项在同时只能有一个,所以它的大小其实只要能容纳最大的那个数据类型就可以了,因此在使用sizeof求类型大小时就会看到他的大小就等于最大类型。比如上面这个ic联合体,由于最大的类型是i,占四字节,所以尽管在存c是只使用了一个字节的空间,但是大小仍然是四。

那么我们在回个头来看看上面图中那个问题,赋值显然就错了,不能同时给两个赋值。当你想把它解释为哪个,就赋值给哪个,当然在使用的时候你就知道里面应该是那个才对。比如图中你想存int型的,那就是给a赋值:d.a = 35;如果想对浮点数的b赋值,那就是d.b = 3.5f,但同时只能是一个,并且访问也应该是这个。

凡事都有例外,其实我们可以通过这个赋一个值,访问另外一个来确定系统的大小端,这个在以往的文章中就出现过,这里就不多说了,感兴趣的可以去以往解惑中找找。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档