1.何为联合体?
问:在c语言编程中,对变量的定义是分配内存的过程,一个变量对应一块内存,那么可不可以将多个变量存储于一块内存中?答案是有的,使用union(联合体)
它的正确表达形式如下:
其占用的字节数与成员中最大数据类型占用的字节数。与结构(struct),枚举(enum)一样,union也属于一种构造类型。
2.联合体变量定义的方法
方法一:先创建模板,再定义变量
方法二:同时创建模板以及定义变量
方法三:基于方法二,可以省略联合体名字(坏处是再往后编程中无法再使用该联合体定义新的变量)
方法四:使用typedef给联合体加个别名
注意:a,b的字节数等于联合体成员中字节长度最大的成员。
3.关于联合体的初始化
关于联合体赋值的操作
由于联合体在同一时间只有一个活跃成员,所以对非活跃成员的赋值会覆盖当前活跃成员的数据,而且编译器不会发出警告或错误
访问联合体成员
访问联合体成员时,应确保了解当前哪个成员是活跃的,否则获取的数据可能是无意义的。
4.联合体的基本特性
nion中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:
①结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
②而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
5.联合体和结构体的区别
1. 定义:两者都通过关键字定义,并且都能包含不同类型的成员变量。
2. 命名:都可以通过`.`运算符或者指向它们的指针的`->`运算符来访问成员变量。
区别
1. 内存布局
- 结构体:结构体的每个成员变量在内存中都有自己的独立空间,按照声明顺序依次排列。
- 联合体:联合体的所有成员变量共享同一片内存区域,同一时刻只能存放一个成员变量的值,改变一个成员变量会影响到其他成员变量的值,因为它们都在同一个内存位置上。
2. 使用
- 结构体:允许同时存储所有成员变量的值,每个成员变量的值都是独立存在的。
- 联合体:在同一时间只能有一个成员有效,也就是说,虽然可以声明多个类型的成员,但只能激活其中的一个用于存储数据。
3. 大小
- 结构体的大小至少是其所有成员变量大小之和(可能还要加上对齐导致的额外空间)。
- 联合体的大小等于其所有成员中最大的成员的大小,因为它只分配足够的空间来容纳最大成员。
4. 应用场景
- 结构体常用于打包相关数据到一起,创建一个新的数据类型,适用于需要同时维护多个状态的情况。
- 联合体常用于节省内存空间,尤其是在需要根据上下文临时存储不同类型数据而又不需要同时保存多种数据的情况下,例如在网络编程中转换不同类型的协议数据包。
总结来说,结构体是为数据聚合和分离提供便利,而联合体则是为了在有限的空间内存储不同类型的单个数据。