联合
联合是类型不同,数目固定的若干个变量的集合。组成联合的若干个成员是共用一个内存地址。
联合的定义格式:
union <联合名>
{
<联合成员说明>
};
联合变量的定义格式:
union <联合名> <联合变量名表>
在定义一个联合变量之前,必须先定义一种联合模式。联合的成员包含几乎所有类型,也包括结构变量。任何一个联合变量都是某种联合模式 的联合变量。
union date
{
char c;
int i;
double d;
} d1,*p;
这是联合模式和联合变量同时定义,而分开的单独定义是:
union date
{
char c;
int i;
double d;
} ;
union date d1,*p;
联合成员的表示方法:
一般联合变量成员:<联合变量名>.<联合成员名> d1.c
指向联合变量指针成员:<指向联合变量指针名> -> <联合成员名> p->c
联合变量的赋值:
一般联合变量赋值: d1.c=‘m';
指向联合变量指针赋值: p ->c='m';
注意:
联合成员共址的特征使得只能对联合变量成员赋值,不能对联合变量赋值。
由于联合变量中的若干个成员共用一个内存地址,因此,在联合变量中只有最近一次被赋值的成员是有意义的。
系统规定,在某个联合的诸多成员中,选定数据长度最大者作为该联合变量所占内存的数据长度,这保证联合成员中具有最大数据长度的成员能够安全地存放在该联合变量所被分配的内存单元中。
联合变量只能用指向联合变量的指针作为函数参数,联合变量不能作为函数参数,联合变量也不能作为函数的返回值。
例一说明联合成员的公共特性:
#include <iostream.h>
union date
{
float f_date;
int i_date;
double d_date;
};
void main()
{
union date d;
d.f_date=2.4;
d.i_date=1;
d.d-date=1.2;
cout<<d.f_date<<','<<d.i_date<<','<<d.d_date<<endl;
cout<<sizeof(d)<<endl;
cout<<&d<<','<<&d.f_date<<','<<&d.i_date<<','<<&d.d_date<<endl;
}
例二说明联合的若干个成员是共用内存同一个地址的:
#include <iostream.h>
void main()
{
union
{
int a[3];
char s[12];
}t;
t.a[0]=0x20494542;
t.a[1]=0x474e494a;
t.a[2]=0x00000a21;
cout<<t.s;
}
联合的应用:
1,在出现两个相互排斥条件下的情况下,可选用联合,因为在某一个时刻只能出现其中的一种条件。
2,联合结构中可以有结构变量,结构中也可以有联合变量。
union address
{
struct off_school town;
struct in_school gown;
};
struct off_school
{
int strnum;
char strnamen[20];
char city[20];
};
struct in_school
{
char collname[10];
char dorm[10];
int roomnum;
};
分析:对于一个学生来说,校内和校外地址只能选择一种,不可能一个学生同时存在两种地址。