自定义类型:联合体

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

联合体类型的声明

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

输出结果:

联合体的特点

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

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

输出结果:

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

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

输出结果:

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

联合体大小的计算

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

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

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

输出结果:

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

联合体的实际应用

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

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

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

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 10:14:05       7 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 10:14:05       8 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 10:14:05       7 阅读
  4. Python语言-面向对象

    2024-07-11 10:14:05       10 阅读

热门阅读

  1. 0124__Linux和Unix的Access.conf安全配置

    2024-07-11 10:14:05       6 阅读
  2. Android11 应用启动流程

    2024-07-11 10:14:05       11 阅读
  3. CentOS-6的iso下载地址镜像yum源

    2024-07-11 10:14:05       9 阅读
  4. 什么是CLR

    2024-07-11 10:14:05       9 阅读
  5. 获取线程id

    2024-07-11 10:14:05       9 阅读
  6. 小抄 20240709

    2024-07-11 10:14:05       7 阅读
  7. 24/07/10数据结构(5.1213)链表OJ

    2024-07-11 10:14:05       9 阅读
  8. VUE学习列表

    2024-07-11 10:14:05       10 阅读
  9. 手动安装Ruby 1.9.3并升级RubyGems

    2024-07-11 10:14:05       14 阅读
  10. uniapp APP端解决video seek跳转时间不准确的问题

    2024-07-11 10:14:05       8 阅读