一、概念
同一个内存空间存放类型不同,不同类型的变量共享一块空间。
Notes:像结构体但是有区别:
1.结构体元素有各自单独空间;共用体元素共享空间,空间大小由最大类型确定。
2.结构体元素互不影响;共用体赋值会导致覆盖。
#include <stdio.h>
struct TestT
{
int idata;
char cdata;
int ddata;
};
union TestU//共用体大小取决于变量类型中最大占用空间的大小
{
int idata;
char cdata;
int ddata;
};
int main()
{
struct TestT t1;
union TestU u1;
printf("结构体t1的大小是:%d\n",sizeof(t1));
printf("联合体u1的大小是:%d\n",sizeof(u1));
t1.idata = 10;
t1.cdata = 'a';
t1.ddata = 20;
printf("idata:%p,%d\n",&t1.idata,t1.idata);
printf("cdata:%p,%d\n",&t1.cdata,t1.cdata);
printf("ddata:%p,%d\n",&t1.ddata,t1.ddata);
u1.idata = 10;
u1.ddata = 20;
u1.cdata = 'a';
printf("u1.idata=%d\n",u1.idata);
printf("idata:%p\n",&u1.idata);
printf("cdata:%p\n",&u1.cdata);
printf("ddata:%p\n",&u1.ddata);
return 0;
}
二、编程实例
有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来处理。
#include <stdio.h>
struct Person
{
char name[32];
int age;
char zhiYe;
char addr[32];
union{
int class;
char keMu[12];
}mes;
};
int main()
{
struct Person p[2];
int i;
for(i=0;i<2;i++){
printf("请输入您的职业:t代表老师,s代表学生\n");
scanf("%c",&(p[i].zhiYe));
if(p[i].zhiYe == 's'){
printf("请输入学生班级:\n");
scanf("%d",&(p[i].mes.class));
printf("请输入学生名字:\n");
scanf("%s",p[i].name);
}else{
printf("请输入老师的科目:\n");
scanf("%s",p[i].mes.keMu);
printf("请输入老师名字:\n");
scanf("%s",p[i].name);
}
getchar();
}
for(i=0;i<2;i++){
if(p[i].zhiYe == 's'){
printf("学生的名字是:%s,班级是%d\n",p[i].name,p[i].mes.class);
}else{
printf("老师的名字是:%s,科目是%s\n",p[i].name,p[i].mes.keMu);
}
}
return 0;
}