自定义类型:联合体

像结构体一样,联合体也是由一个或者多个成员组成,这些成员可以是不同的类型。

联合体类型的声明

编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体

输出结果:

联合体的特点

  • 给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
  • 联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。

1、那么如果给联合体的其中一个成员赋值,其他成员是否会发生变化呢,我们通过实验证明。

输出结果:

如上图所示,如果给联合体的其中一个成员赋值,其他成员的值会发生变化。

2、那么结构体的成员是否真的共用同一块内存空间呢,我们通过实验进行证明:

输出结果:

从输出结果可以看到,无论是整个联合体的地址,还是联合体中成员的地址,都是用的同一块存储空间。

联合体大小的计算

  • 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
  • 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
例如:
在联合体中创建一个包含5个元素的字符数组和一个整型变量,计算联合体内存空间大小。
输出结果:
实际上,这里很多人会误以为联合体所占用的空间是5个字节,实际上,5个字节确实是联合体内最大的成员,但是联合体内最大的对齐数是4,5个字节只是由5个char类型组成, 本质上对齐数还是1,而 联合体的总大小为联合体内最大对齐数的倍数,所以联合体的总大小为8个字节.

相同成员变量的结构体和联合体对比

下面我们通过一幅图,来计算结构体和联合体各自所占的内存空间大小。

输出结果:

从输出结果可以看出,结构体和联合体还是有一定区别的。

联合体的实际应用

1、使⽤联合体是可以节省空间的,⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

  • 图书:书名、作者、⻚数
  • 杯⼦:设计
  • 衬衫:设计、可选颜⾊、可选尺⼨

如果我们没有经过思考,就会写出下面的结构体:

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存
经过处理后的结构体:
因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的, 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以减少 所需的内存空间,⼀定程度上节省了内存。
如图所示:
2、 写⼀个程序,判断当前机器是⼤端字节序?还是⼩端字节序?
首先,我们在函数中创建一个联合体,包含整型和字符型两个成员变量,然后将整型变量赋值为1,最后返回字符型变量,由于联合体共用一块内存空间,若返回的是0,则为大端字节序,若返回的是1,则为小端字节序。
输出结果:
由输出结果可知,当前电脑为小端字节序。
  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值