联合(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};// 指定初始化器
示例
//Visual Studio中加上这句才可以使用scanf() //否则只能使用scanf_s() #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <ctype.h> //malloc()、free() #include <stdlib.h> #include <time.h> union hold { int digit; double bigfl; char letter; }; //声明结构的同时声明变量 struct { int code; float cost; } item, * ptrst; //item.code //ptrst = &item; ptrst->code; (*ptrst).code /* 联合与结构嵌套使用 */ struct owner { char socsecurity[12]; }; struct leasecompany { char name[4]; char headquarters[40]; }; union data { struct owner owncar; struct leasecompany leasecar; }; struct car_data { char make[15]; int status; union data ownerinfo; //匿名联合(C11) union { struct owner owncar; struct leasecompany leasecar; }; }; //argc: 参数个数 argv[]: 参数数组 //int main(int argc, char **argv) int main(int argc, char *argv[]) { union hold fit; union hold * pu; //在联合中,一次只储存一个值。即使有足够的空间, //也不能同时储存一个char类型值和一个int类型值。 fit.digit = 23; //fit.bigfl = 2.0; //fit.letter = 'h'; pu = &fit; int x = pu->digit; //相当于x = fit.digit system("pause"); return 0; }