32-联合简介
14.10 联合简介
联合(union)是一种数据类型,它能在同一个内存空间中存储不同的数据类型(不是同时存储)。其典型的用法是,设计一种表以存储既无规律、事先也不知道顺序的混合类型。使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。
创建联合和创建结构的方式相同,需要一个联合模板和联合变量。可以用一个步骤定义联合,也可以用联合标记分两步定义。下面是一个带标记的联合模板:
union hold {
int digit;
double bigfl;
char letter;
};
根据以上形式声明的结构可以存储一个 int
类型、一个 double
类型和 char
类型的值。然而,声明的联合只能存储一个 int
类型的值或一个 double
类型的值或 char
类型的值。
下面定义了3个与 hold
类型相关的变量:
union hold fit; // hold类型的联合变量
union hold save[10]; // 内含10个联合变量的数组
union hold * pu; // 指向hold类型联合变量的指针
第1个声明创建了一个单独的联合变量 fit
。编译器分配足够的空间以便它能存储联合声明中占用最大字节的类型。在本例中,占用空间最大的是 double
类型的数据。在我们的系统中, double
类型占64位,即8字节。第2个声明创建了一个数组 save
,内含10个元素,每个元素都是8字节。第3个声明创建了一个指针,该指针变量存储 hold
类型联合变量的地址。
可以初始化联合。需要注意的是,联合只能存储一个值,这与结构不同。有3种初始化的方法:把一个联合初始化为另一个同类型的联合;初始化联合的第1个元素;或者根据C99标准,使用指定初始化器:
union hold valA;
valA.letter = 'R';
union hold valB = valA; // 用另一个联合来初始化
union hold valC = {88}; // 初始化联合的digit 成员
union hold valD = {.bigfl = 118.2}; // 指定初始化器