像结构体一样,联合体也是由一个或者多个成员组成,这些成员可以是不同的类型。
联合体类型的声明
编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体。
输出结果:
联合体的特点
- 给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
- 联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。
1、那么如果给联合体的其中一个成员赋值,其他成员是否会发生变化呢,我们通过实验证明。
输出结果:
如上图所示,如果给联合体的其中一个成员赋值,其他成员的值会发生变化。
2、那么结构体的成员是否真的共用同一块内存空间呢,我们通过实验进行证明:
输出结果:
从输出结果可以看到,无论是整个联合体的地址,还是联合体中成员的地址,都是用的同一块存储空间。
联合体大小的计算
- 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
- 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
例如:
在联合体中创建一个包含5个元素的字符数组和一个整型变量,计算联合体内存空间大小。
输出结果:
实际上,这里很多人会误以为联合体所占用的空间是5个字节,实际上,5个字节确实是联合体内最大的成员,但是联合体内最大的对齐数是4,5个字节只是由5个char类型组成, 本质上对齐数还是1,而 联合体的总大小为联合体内最大对齐数的倍数,所以联合体的总大小为8个字节.
相同成员变量的结构体和联合体对比
下面我们通过一幅图,来计算结构体和联合体各自所占的内存空间大小。
输出结果:
从输出结果可以看出,结构体和联合体还是有一定区别的。
联合体的实际应用
1、使⽤联合体是可以节省空间的,⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
- 图书:书名、作者、⻚数
- 杯⼦:设计
- 衬衫:设计、可选颜⾊、可选尺⼨
如果我们没有经过思考,就会写出下面的结构体:
上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。
经过处理后的结构体:
因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的, 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以减少 所需的内存空间,⼀定程度上节省了内存。
如图所示:
2、 写⼀个程序,判断当前机器是⼤端字节序?还是⼩端字节序?
首先,我们在函数中创建一个联合体,包含整型和字符型两个成员变量,然后将整型变量赋值为1,最后返回字符型变量,由于联合体共用一块内存空间,若返回的是0,则为大端字节序,若返回的是1,则为小端字节序。
输出结果:
由输出结果可知,当前电脑为小端字节序。