共用体同结构体的定义形式上相同,只是把关键字struct改为union。
有时需要把几种不同类型的变量放在同有一内存区域中,见图12-6,把一个整型变量,一个字符变量,一个实型变量放在同一内存区域中,尽管三个变量占用字节数各不相同,但起始地址都一样(例如1000)它要用“覆盖’’技术,使多个变量互相覆盖。这种结构称为共同体或者联合。
定义共用体方式类似结构体。
例如:
union data 或union 或union data
{ int i; { int i; {int i;
char ch; char ch char ch
float f; float f; float f;
}a,b,c; }a,b,c; };
union data a,b,c;
“共用体”和“结构体”定义形式相似,但其含义不同。结构体变量所占内存长度是各成员的内存之和(如图13-6为七个字节),但共用体变量所占内存长度是最长成员的长度(如图13-6中为4个字节)。
12.6.2引用方式
先定义共用体变量后才可以引用它。不能引用共用体变量本身。而只能引用其中的成员。例如:printf(″%d″,a);是错误的,printf(″%d″,a.i);是正确的。
例12-10
main()
{ union tdate
{ int uint;
long tlong;
float tfloat;
doudle tdouble;
char *tstring:
}t;
t.uint=3;printf(″%d\n″,t.uint);
t.tlong=300;printf(″%1d\n″,t.tlong);
t.tfloat=3.0;printf(″%f\n″,t.tfloat);
t.tdouble=3.00;printf(″%f\n″,t.tdouble);
t.tstring=″stu″;printf(″%s\n″,t.tstring);
}
12.6.3共用体的特点
(1)同一内存段可放几种不同类型的成员,但每一瞬间只能存放一种。例如:
a.i=1;
a.c=′a′;
a.f=2.1;
在完成以上三个运算后,只有a.f是有效的,a.i及a.c都不再有效,因此用printf(″%f″,a.f);是可以的。但不能用printf(″%c″,a.c);,所以引用共同体变量时应该特别注意当前放的是什么数据。
(2)共用体变量地址及其各成员地址都是同一地址。即&a,&a.i,&a.c,&a.f值相同。
(3)不能对共用体变量名赋值。也不能定义时进行初始化。
(4)不能把共用体变量作为函数参数,也不能使函数返回共同体变量,但可以使用指向共用体的指针。
(5)允许定义共用体数组。