有时候同一个内存空间存放类型不同,不同类型的变量共享一块空间
像结构体,但是有区别
1、
结构体元素有各自单独空间,
共用体元素共享空间,空间大小由最大类型确定
同一块空间,有时候存放char类型、有时候存放int型,有时候存放double型
2、
结构体元素互不影响。
共用体赋值会导致覆盖(一定要注意)
c
#include <stdio.h>
struct TestT
{
int a;
int b;
char c;
};
union TestU
{
int a;
double b;
char c;
};
int main()
{
struct TestT t1;
union TestU u1;
printf("结构体ti的大小是:%d\n",sizeof(t1));
printf("共用体体ti的大小是:%d\n",sizeof(u1));
t1.a = 10;
t1.b = 20;
t1.c = 30;
printf("a = %d\n",t1.a);
printf("b = %d\n",t1.b);
printf("c = %d\n",t1.c);
printf("a :%p\n",&t1.a);
printf("b :%p\n",&t1.b);
printf("c :%p\n",&t1.c);
u1.a = 10;
u1.b = 20;
u1.c = 30;
printf("a = %d\n",u1.a);
printf("a :%p\n",&u1.a);
printf("b :%p\n",&u1.b);
printf("c :%p\n",&u1.c);
return 0;
}
结果:
结构体ti的大小是:12
共用体体ti的大小是:8
a = 10
b = 20
c = 30
a :000000000061FE14
b :000000000061FE18
c :000000000061FE1C
a = 30
a :000000000061FE08
b :000000000061FE08
c :000000000061FE08
共用体应用:
有若干个人员的数据,其中有学生和教师,
学生的数据中包括:姓名、号码、性别、职业、班级,
教师的数据包括:姓名、号码、性别、职业、职务,
要求用同一个表格来处理
c
#include<stdio.h>
struct Person
{
char name[32];
int num;
char gender[32];
char zhiye;
union {
char class[32];
char job[32];
}mes;
};
int main()
{
struct Person p[2];
int i;
for(i=0;i<2;i++){
printf("请输入你的职业,s为学生,t为老师\n");
scanf("%c",&(p[i].zhiye));
if(p[i].zhiye=='s'){
printf("请输入学生的班级\n");
scanf("%s",&(p[i].mes.class));
printf("请输入学生的姓名\n");
scanf("%s",&(p[i].name));
printf("请输入学生的号码\n");
scanf("%d",&(p[i].num));
printf("请输入学生的性别\n");
scanf("%s",&(p[i].gender));
}
else{
printf("请输入老师的职务\n");
scanf("%s",&(p[i].mes.job));
printf("请输入老师的姓名\n");
scanf("%s",&(p[i].name));
printf("请输入老师的号码\n");
scanf("%d",&(p[i].num));
printf("请输入老师的性别\n");
scanf("%s",&(p[i].gender));
}
getchar();
}
for(i=0;i<2;i++){
if(p[i].zhiye=='s'){
printf("姓名:%s,号码:%d,性别:%s,职业:%c,班级:%s\n",p[i].name,p[i].num,p[i].gender,p[i].zhiye,p[i].mes.class);
}
else{
printf("姓名:%s,号码:%d,性别:%s,职业:%c,职务:%s\n",p[i].name,p[i].num,p[i].gender,p[i].zhiye,p[i].mes.job);
}
}
return 0;
}