共用体同结构体的定义形式上相同,只是把关键字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)允许定义共用体数组。