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