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

问题: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,但同时只能是一个,并且访问也应该是这个。

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

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

在编程中写的最多的一句代码是啥?

挺有意思的一个问题,作为一个天天写代码的人平时也没怎么太在意这些细节,过滤了几种编程语言,大致总结了几种常用的代码

913
来自专栏令仔很忙

EasyUI----EasyUI-Tree联想加模糊查询

最近做的项目中用到了EasyUI的Tree,树的结构是这样的,有22个车站,每一个车站相当于一个逻辑域(虚拟域),每一个域下有许多的设备类型,拿我现在做的门禁系...

714
来自专栏web编程技术分享

JavaScript: 零基础轻松学闭包(1)

1825
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet系列 之 元素删除

  平时代码总会遇到一些关于集合的操作,例如添加,排序等等,都可算作稀松平常,但是集合涉及的删除操作却一直有个大坑,我自己便跳进去过好几回,在此简单一记,以自警...

461
来自专栏小芭乐的专栏

Markdown 编辑器指南

Markdown 是一种轻量级标记语言。语法简单明了,浏览本篇指引文章,学会使用markdown,就可以开始写文章了。markdown编辑器采用左边纯markd...

3732
来自专栏禹都一只猫博客

Pandas基本功能详解 | 轻松玩转Pandas(2)

592
来自专栏偏前端工程师的驿站

CSS魔法堂:"那不是bug,是你不懂我!" by inline-block

前言  每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display...

1958
来自专栏写代码的海盗

准备冲锋 golang入坑系列

史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意。 所以换成史前摘要,反正是一个意思。 此摘要的目的仍然是提醒点击而来的同学,本系列最...

3295
来自专栏zaking's

js算法初窥04(算法模式01-递归)

992
来自专栏iKcamp

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 8 章:列表操作

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 8 章:列表操作 你是否还沉...

2047

扫码关注云+社区