“联合”和“结构”有些相似的处但两者有本质上区别在结构中各成员有各自内存空间个结构变量总长度是各成员长度的和而在“联合”中各成员共享段内存空间个联合变量长度等于各成员中最长长度应该介绍说明是这里所谓共享不是指把多个成员同时装入个联合变量内而是指该联合变量可被赋予任成员值但每次只能赋种值赋入新值则冲去旧值如前面介绍“单位”变量如定义为个可装入“班级”或“教研室”联合后就允许赋予整型值(班级)或串(教研室)要么赋予整型值要么赋予串不能把两者同时赋予它联合类型定义和联合变量介绍说明个联合类型必须经过定义的后才能把变量介绍说明为该联合类型
、联合定义
定义个联合类型般形式为:
union联合名
{
成员表
};
成员表中含有若干成员成员般形式为:类型介绍说明符成员名成员名命名应符合标识符规定
例如:
unionperdata
{
;
charoffice[10];
};
定义了个名为perdata联合类型它含有两个成员个为整型成员名为;另个为名为office联合定义的后即可进行联合变量介绍说明被介绍说明为perdata类型变量可以存放整型量或存放office
2、联合变量介绍说明
联合变量介绍说明和结构变量介绍说明方式相同也有 3种形式即先定义再介绍说明;定义同时介绍说明和直接介绍说明以perdata类型为例介绍说明如下:
unionperdata
{
;
charofficae[10];
};
unionperdataa,b;/*介绍说明a,b为perdata类型*/
或者可同时介绍说明为:
unionperdata
{
;
charoffice[10];
}
a,b;或直接介绍说明为:
union
{
;
charoffice[10];
}
a,b
经介绍说明后a,b变量均为perdata类型它们内存分配示意图如图7—8所示a,b变量长度应等于perdata成员中最长长度即等于office长度共10个字节从图中可见a,b变量如赋予整型值时只使用了2个字节而赋予时可用10个字节
联合变量赋值和使用
对联合变量赋值使用都只能是对变量成员进行联合变量成员表示为:联合变量名.成员名例如a被介绍说明为perdata类型变量的后可使用a. a.office不允许只用联合变量名作赋值或其它操作也不允许对联合变量作化赋值赋值只能在中进行还要再强调介绍说明是个联合变量每次只能赋予个成员值换句话说个联合变量值就是联合变员某个成员值
[例7.15]设有个教师和学生通用表格教师数据有姓名年龄职业教研室 4项学生有姓名年龄职业班级 4项
编程输入人员数据再以表格输出
{
struct
{
charname[10];
age;
charjob;
union
{
;
charoffice[10];
}depa;
}body[2];
n,i;
for(i=0;i<2;i)
{
prf("inputname,age,jobanddepartment\\n");
scanf("%s%d%c",body[i].name,&body[i].age,&body[i].job);
(body[i].jobs)
scanf("%d",&body[i].depa.);
scanf("%s",body[i].depa.office);
}
prf("name\\tagejob/office\\n");
for(i=0;i<2;i)
{
(body[i].jobs)
prf("%s\\t=<%d\\n",body[i].name,body[i].age,body[i].job,body[i].depa.);
prf("%s\\t=<%s\\n",body[i].name,body[i].age,
body[i].job,body[i].depa.office);
}
}
本例用个结构body来存放人员数据该结构共有 4个成员其中成员项depa是个联合类型这个联合又由两个成员组成个为整型量个为office在第个for语句中输入人员各项数据先输入结构前 3个成员name,age和job然后判别job成员项如为"s"则对联合depa·输入(对学生赋班级编号)否则对depa·office输入(对教师赋教研组名)
在用scanf语句输入时要注意凡为类型成员无论是结构成员还是联合成员在该项前不能再加"&"运算符如第18行中
body[i].name是个类型第22行中body[i].depa.office也是类型因此在这两项的间不能加"&"运算符中第 2个for语句用于输出各成员项值
最新评论