专栏首页程序员互动联盟【答疑解惑】如何玩转C语言联合体赋值?

【答疑解惑】如何玩转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)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java到底和C++有啥区别?

    作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。 然而,C++和...

    程序员互动联盟
  • 数据库常见的图形工具有哪些?

    疑惑一 MySQL常用的图形化管理工具有哪些? 现在随着PHP+MySql越来越火,周边相关产品也受到众多人的关注。在PC上修改数据库,查看数据库内容是研发人员...

    程序员互动联盟
  • 【答疑解惑】Java中基本数据在内存中是如何存储的

    Java的基本数据类型共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有stri...

    程序员互动联盟
  • X君和T君关于通用学习机的对话 - 之三

    X君和T君是老朋友。X君是数学家,对通用学习机比较有心得。T君是物理学家,资深程序员,软件专家。他们已经两次在纽约城谈通用学习机。今天他们通过电话第三次谈通用学...

    用户1908973
  • 微信公众平台开发接口PHP SDK完整版

    官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0...

    joshua317
  • AI+教育引领减负新浪潮,讯飞智能学习机精准学习助力「后浪」高考夺魁

    自从1977年恢复高考,40多年来,高考从未迟到,更未缺席。但,2020年的高考却创造了历史:因疫情的影响,推迟一个月。

    新智元
  • javascript当中Date对象用法

    2.Date对象 例 2.1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

    马克java社区
  • 【学习笔记】区别Kotlin中的object和companion object关键字

    2017-06-20 by Liuqingwen | Tags: Kotlin | Hits

    IT自学不成才
  • 一个SQL语句引发的ORA-00600错误排查(二)(r9笔记第65天)

    继昨天一个SQL语句导致的ORA-00600错误之后,我给出了背景和初步的分析结果,今天来给出我的结论,当然说明原因不是我的本意,还有反思。 首先语句类似这样的...

    jeanron100
  • 【直播】我的基因组59:CNV初步探索

    好久不见,基因组直播又来了。这篇推送是对SNV进行一个初步探索。 单纯的一个样本来找CNV,总是不太准确的,但还是那句话,毕竟是自己的基因组,硬着头皮也要上。当...

    生信技能树

扫码关注云+社区

领取腾讯云代金券