- C++ 从入门到项目实践(超值版)
- 聚慕课教育研发中心
- 1086字
- 2021-03-24 01:16:13
4.6 共用体类型(union)

有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可以定义一个整形变量,一个字符型变量,一个实型变量放在同一地址开始的内存单元中。以上3个变量在内存单元中占的字节数不同,但是都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。共用体也是一种构造数据类型,它是将不同类型的变量存放在同一内存区域内。共用体也称为联。
共用体的类型定义、变量定义及引用方式与结构体相似,但它们有着本质的区别:结构体变量的各成员占用连续的不同存储空间,而共用体变量的各成员占用同一个存储区域。
声明共用体的一般形式:

1. 定义共用体变量
定义共用体变量的一般形式:
共用体类型名 共用体变量名;
定义共用体变量的方法有以下三种:
(1)先定义共用体类型,再定义该类型数据。
例如:

(2)在定义共用体类型的同时定义该类型变量。
例如:

(3)不定义共用体类型名,直接定义共用体变量。
例如:

定义了共用体变量后,系统就给它分配内存空间。因共用体变量中的各成员占用同一存储空间,所以,系统给共用体变量所分配的内存空间为其成员中所占用内存空间最多的成员的单元数。共用体变量中各成员从第一个单元开始分配存储空间,所以各成员的内存地址是相同的。
2. 共用体变量的引用
(1)定义了共用体变量后,即可使用它。若需对共用体变量初始化,只能对它的第一个成员赋初始值。
例如:

(2)使用共用体变量的目的是希望通过统一内存段存放几种不同类型的数据。
注意:每一瞬间只能存放一种,而不是存放几种。并且,如果对新的成员变量进行赋值的话,原来的成员变量的值就被覆盖了。
【例4-8】编写程序,输出共用体成员变量的值。
(1)在Visual Studio 2017中,新建名称为“4-8.cpp”的Project8文件。
(2)在代码编辑区域输入以下代码。

【程序分析】本例定义了一个共用体,该共用体有两个char型成员变量a和b。接着定义了一个共用体变量x,通过逗号运算符对共用体成员进行赋值。先给a赋值为M,给b赋值为x。结果第一次输出a的值是M,第二次输出的是x,所以证明它们是公用地址的。
在Visual Studio 2017中的运行结果如图4-17所示。

图4-17 共用体
3. 共用体类型数据的特点
(1)使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意,在每一瞬时只能存放其中一种,而不是同时存放几种。
(2)能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后,原有的成员就失去作用。
(3)共用体变量的地址和它的各成员的地址都是同一地址。
(4)不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
(5)共用体和结构体可以互相嵌套。