共用体/联合体
联合体union:像结构体但是有区别
联合体/共用体和结构体的区别:
- 结构体元素有各自单独空间;共用体元素共享空间,空间大小有最大类型确定
- 结构体元素互不影响;共用体赋值会导致覆盖
结合代码注释理解
示例代码:
#include<stdio.h>
//联合体/共用体和结构体的区别
//1. 结构体元素有各自单独空间;共用体元素共享空间,空间大小有最大类型确定
//2. 结构体元素互不影响;共用体赋值会导致覆盖
struct TestS
{
int idata;
char cdata;
double ddata;
};
union TestU
{
int idata;
char cdata;
double ddata;
};
int main()
{
struct TestS s1;
union TestU u1;
printf("结构体s1的大小:%d\n",sizeof(s1));
printf("联合体u1的大小:%d\n",sizeof(u1));
printf("结构体idata:%p\n",&s1.idata);
printf("结构体cdata:%p\n",&s1.cdata);
printf("结构体ddata:%p\n",&s1.ddata);
printf("联合体idata:%p\n",&u1.idata);
printf("联合体cdata:%p\n",&u1.cdata);
printf("联合体ddata:%p\n",&u1.ddata);
s1.idata=10;
s1.cdata='a';
s1.ddata=20.0;
printf("s1:idata=%d\n",s1.idata);
printf("s1:cdata=%c\n",s1.cdata);
printf("s1:ddata=%lf\n",s1.ddata);
u1.idata=10;
u1.cdata='a';
printf("u1:%d\n",u1.idata);//注意:共用体后面赋的值会覆盖前面赋的值,因为共用一片空间
return 0;
}
运行结果:
联合体小练习:实现学生和老师信息的封装以及输出
结合代码注释理解
示例代码:
#include<stdio.h>
struct Person
{
char name[32];
int num;
char sex;
char job;//工作
union
{
int class;//学生所在班级
char subjt[14];//老师教的科目
}mes;
};
int main()
{
struct Person per[2];
int i;
for(i=0;i<2;i++)
{
printf("请输入职业: t代表教师,s代表学生\n");
scanf("%c",&(per[i].job));
if(per[i].job=='t')
{
puts("请输入教师名字:");
scanf("%s",per[i].name);
puts("请输入教师编号: ");
scanf("%d",&(per[i].num));
getchar();//吸收回车符,防止后面的scanf录入
puts("请输入教师性别: b代表男,g代表女");
scanf("%c",&(per[i].sex));
puts("请输入教师所教的科目:");
scanf("%s",per[i].mes.subjt);
}else
{
puts("请输入学生名字:");
scanf("%s",per[i].name);
puts("请输入学生编号: ");
scanf("%d",&(per[i].num));
getchar();
puts("请输入学生性别: b代表男,g代表女");
scanf("%c",&(per[i].sex));
puts("请输入学生所在班级:");
scanf("%d",&(per[i].mes.class));
}
getchar();//吸收回车符,防止后一轮循环的第一个scanf录入
}
for(i=0;i<2;i++)
{
if(per[i].job=='t')
{
printf("教师名字:%s 编号:%d 性别:%c 所教科目:%s\n",
per[i].name,per[i].num,per[i].sex,per[i].mes.subjt);
}else
{
printf("学生名字:%s 编号:%d 性别:%c 班级:%d\n",
per[i].name,per[i].num,per[i].sex,per[i].mes.class);
}
}
return 0;
}
运行结果: