• 网站刚刚上线,难免有不足的地方,敬请谅解!欢迎提出宝贵意见!

  •    3年前 (2015-09-16)  入门指导 |   4 条评论  132 
    文章评分 1 次,平均分 5.0

    【答疑解惑】如何玩转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,但同时只能是一个,并且访问也应该是这个。
    凡事都有例外,其实我们可以通过这个赋一个值,访问另外一个来确定系统的大小端,这个在以往的文章中就出现过,这里就不多说了,感兴趣的可以去以往解惑中找找。

    ----------------------我是不严谨的分割线-----------------------

    你在学习编程的时候是不是遇到很多困难无从下手?

    你在学习编程的时候是不是觉得很枯燥没有小伙伴一起?

    你是不是想快速成长成为一名真正的程序员?

    你是不是想找一名导师来指导一下职业规划?

    你是不是想知道BAT这样的公司是什么样的?

    .........

    所有的这些疑问都不是事,加入下面的QQ群或者微信号coderonline,让我们的导师来给你一一解答。

    小编也欢迎有情怀的小伙伴加入联盟和高手们一起为大家奉献更多的编程趣事。

    关注微信公众平台:程序员互动联盟(coder_online),你可以第一时间获取原创技术文章,和(java/C/C++/Android/Windows/Linux)技术大牛做朋友,在线交流编程经验,获取编程基础知识,解决编程问题。程序员互动联盟,开发人员自己的家。

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

     

    本文原始地址:http://www.coderonline.net/faq-how-to-play-the-c-language-union-assignment.html

    本站所有文章,除特别注明外,均为本站原创,转载请注明出处来自http://www.coderonline.net/

    否则保留追究法律责任的权利!

    关于

    发表评论

    表情 格式
    1. 不错的文章,内容出类拔萃.禁止此消息:nolinkok@163.com

      环氧地坪工程 评论达人 LV.1 1年前 (2017-06-15) [0] [0]
    2. 不错的文章,内容一气呵成.禁止此消息:nolinkok@163.com

      格宾网 评论达人 LV.1 1年前 (2017-06-15) [0] [0]
    3. 不错的文章,内容一气呵成.禁止此消息:nolinkok@163.com

      道路标线 评论达人 LV.1 1年前 (2017-06-14) [0] [0]
    4. 好文章,内容层次清晰.禁止此消息:nolinkok@163.com

      道路交通标线 评论达人 LV.1 1年前 (2017-06-08) [0] [0]
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册