共用体类型可以在同一段内存单元存放不同类型的变量。一般形式为:
union 共用体类型名
{成员列表
}变量列表;如:
union Data
{
int i; //表示不同类型的变量i,ch,f能存放到同一段内存中
char ch;
float f;
}a,b,c; //在定义变量同时定义变量
共用体与结构体的区别
结构体变量所占用的内存长度是各成员所占的内存长度,每个成员都有自己的储存单元。而共用体变量所占的内存长度等于最长的成员所占的内存长度。如上面定义的共用体变量a,b,c各占4个字节而不是各占9个字节。
共用体类型数据的特点
(1)同一个内存段可以用来存放几种不同的类型成员,但在每一瞬间只能存放其中一个成员,而不是存放几个。
(2)可以对共用体成员进行初始化,但是初始化表中只能有一个常量。如:
union Data
{
int i;
char ch;
float f;
} a={1,'a',1.5}; //错误,不能初始化3个成员,他们占用同一段存储单元
union Data a={16}; //正确。对第一个成员初始化
union Data a={.ch='j'}; //C99允许对指定的一个成员进行初始化
(3)共用体变量中作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元的值就被取代。
a.ch='a';
a.f=1.5;
a.i=40;
完成三个赋值运算后变量存储单元中的值为40,原来的值都被覆盖了,此时如果用printf("%d",a.i);输出结果为40。而如果用printf("%c",a.ch);则输出的值不是'a',而是'('。
(4)共用体变量的地址和它的成员的地址都是同一个地址。
(5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
(6)C99允许共用体变量作为函数参数
(7)共用体变量可以出现在结构体类型定义中,也可以定义共用体数组,反之也是一样。