7.4 共用体
共用体又称为联合体,是由不同的数据类型组成的一个整体。与结构体不同的是,共用体每次只能使用其中一个成员。结构体的总长度是结构体所有成员长度之和,共用体的总长度是其中最长一个数据类型的长度,共用体的所有成员共享这一存储空间。在一些场合中,只需要使用某一类型的变量而其他类型的变量暂时不需要使用。当使用另一类型变量时,原先的变量也转为与程序无关,这种情况下可使用共用体节省同时存在多种数据类型变量所需要的额外空间。
7.4.1 共用体的定义
定义共用体使用修饰符 union,一般形式是:
union 共用体名
{
成员列表
};
共用体名是该共用体独一无二的名称,命名规则与变量命名相同。成员项列表是共用体中数据成员的数据类型和名称,数据成员可以是变量、数组或者其他结构体等复合数据结构,各成员通常不使用相同的数据类型。成员项列表的一般形式为:
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;
使用共用体声明变量的一般形式为:
union 共用体名 共用体变量名;
该语句只能在共用体定义后出现。如下例所示:
union unidate
{
char a;
int b;
long c;
doubule d;
};
union unidate x;
共用体成员中,长度最长的是双精度浮点型 d,共用体变量 x 的长度为双精度浮点型数据类型的长度。
7.4.2 共用体变量的引用
共用体变量的引用方式与结构体变量相同,一般形式为:
共用体名.成员名
但共用体一次只能使用一个成员,如下例所示:
#include <stdio.h> int main(void)
{
union unidate // 共用体名
{
char a; // 共用体成员
int b;
long c;
double d;
}; union unidate x; // 声明共用体变量
x.a = 65; // 为成员 a 赋值
printf("x.a = %c\n", x.a); x.b = 100;
printf("x.b = %d\n", x.b); // 为成员 b 赋值 x.c = 10005000; // 为成员 c 赋值
printf("x.c = %ld\n", x.c); x.d = 0.69314718056; // 为成员 d 赋值
printf("x.d = %f\n", x.d); printf("x.a = %c\n", x.a); // 再次输出成员 a,这时成员 a 已经没被使用 return 0;
}
该程序的输出结果为:
x.a = A
x.b = 100
x.c = 10005000
x.d = 0.693147
x.a =
最后一次输出的结果为不可预知的,因为共用体 x 的存储空间中已经被成员 x.d 使用过,而输出成员 x.a 前,没有重新为成员 x.a 赋值,这时如果引用成员 x.a 的数据,获得的是成员 x.d 的一部分数据,所以输出结果可能因系统环境的不同而有差异。