【答疑解惑】如何玩转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 条评论
登录 后参与评论

相关文章

来自专栏增长技术

App Guide相关

##TourGuide https://github.com/worker8/TourGuide

702
来自专栏码匠的流水账

聊聊HystrixThreadPool

hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java

771
来自专栏ml

md5算法原理一窥(其一)

    首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法。其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系。 所以解密MD5没有现...

3887
来自专栏Hadoop数据仓库

Oracle sqlldr 如何导入一个日期列

1. LOAD DATA INFILE * INTO TABLE test FIELDS TERMINATED BY X'9' TRAILING NULLCO...

1786
来自专栏码匠的流水账

聊聊FilterSecurityInterceptor

本文就来研究一下spring security的FilterSecurityInterceptor

491
来自专栏前端儿

Web 前端颜色值--字体--使用,整理整理

颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义。对光源进行设置的最低值可以是 0(十六进制 00)。最高值是 2...

2272
来自专栏封碎

Android中Broadcast的Intent大全 博客分类: Android小技巧 Android.netWAPGoogle

962
来自专栏JMCui

MongoDB系列五(地理空间索引与查询).

Volvo Today, Volvo announced i...

2712
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

5896
来自专栏项勇

[Android笔记7]之通过DatePickerDialog,TimePickerDialog调用系统时间设置

2753

扫码关注云+社区