- 一、联合体和共用体的引入
- 二、共用体数据的覆盖问题
- 三、共用体开发案例
联合体,又叫共用体,它和结构体相似,定义如下:
union TestU
{
int idata;
char cdata;
double ddata;
};
注意几点:
- 联合体和结构体不同,结构体中每个元素单独占用一片内存空间,而联合体元素共享空间,空间大小由最大类型确定。
- 结构体元素互不影响,共用体赋值会导致覆盖。
可以看一幅图:
我们打印一下结构体和共用体的大小和其中元素的地址:
#includestruct TestT { int idata; char cdata; double ddata; }; union TestU { int idata; char cdata; double ddata; }; int main() { struct TestT t1; union TestU u1; printf("结构体t1的大小为:%dn",sizeof(t1)); printf("联合体u1的大小为:%dn",sizeof(u1)); printf("idata:%pn",&t1.idata); printf("cdata:%pn",&t1.cdata); printf("ddata:%pn",&t1.ddata); printf("idata:%pn",&u1.idata); printf("cdata:%pn",&u1.cdata); printf("ddata:%pn",&u1.ddata); return 0; }
运行结果:
由此可见,结构体的大小是所有元素大小之和,而联合体大小则是最大元素
d
o
u
b
l
e
double
double 。结构体中元素的地址是按顺序独立排列的,而联合体中元素的地址是相同的。
在上面我们提到,共用体所有元素占同一片内存空间,所以它元素赋值会被覆盖。下面我们实际操作一下看看:
#includeunion TestU { int idata; char cdata; double ddata; }; int main() { union TestU u1; u1.idata = 10; u1.cdata = 'a'; printf("idata=%dn",u1.idata); printf("cdata=%dn",u1.cdata); printf("ddata=%dn",u1.ddata); return 0; }
运行结果:
由此可见,元素每一次被赋值,联合体中元素的值都会发生改变。
由若干人的数据,其中有学生和教师,学生的数据包括姓名和班级,教师的职业包括姓名和科目。要求用同一个表格来处理。
#includestruct Person { char name[32]; char work; union D { int class; char subject[32]; }msg; }; int main() { struct Person p[2]; int i; for(i = 0;i<2;i++){ printf("请输入职业,t代表老师,s代表学生:n"); scanf("%c",&(p[i].work)); if(p[i].work == 's'){ printf("请输入学生的姓名:n"); scanf("%s",p[i].name); printf("请输入学生的班级:n"); scanf("%d",&(p[i].msg.class)); } else{ printf("请输入教师的姓名:n"); scanf("%s",p[i].name); printf("请输入教师的科目:n"); scanf("%s",p[i].msg.subject); } getchar(); } for(i = 0;i<2;i++){ if(p[i].work == 's'){ printf("学生的姓名为:%s,学生的班级为:%dn",p[i].name,p[i].msg.class); } else{ printf("教师的姓名为:%s,教师的科目为:%sn",p[i].name,p[i].msg.subject); } } return 0; }
运行结果:



