联合体的概念
联合体也叫共用体,它是C语言中与结构体类似的数据结构,不同之处在于,联合体共享同一块内存空间,存放不同类型的变量。联合体的内存大小由最大类型元素的空间决定,而结构体每个元素拥有独立空间。下面定义一个联合体和一个结构体,并输出他们的大小和成员们的地址:
#include <stdio.h>
union Testu
{
int a;
char b;
int c;
};
struct Testt
{
int a;
char b;
int c;
};
int main()
{
union Testu u1;
struct Testt t1;
printf("联合体的大小是:%d\n",sizeof(u1));
printf("结构体的大小是:%d\n",sizeof(t1));
printf("联合体成员a的地址是:%p",&u1.a);
printf("联合体成员b的地址是:%p",&u1.b);
printf("联合体成员c的地址是:%p",&u1.c);
printf("结构体成员a的地址是:%p",&t1.a);
printf("结构体成员b的地址是:%p",&t1.b);
printf("结构体成员c的地址是:%p",&t1.c);
return 0;
}
为什么算出来联合体大小为4,而结构体大小而12?
是因为联合体所有成员共享内存,大小为最大成员的大小4(int);而结构体成员依次存储,考虑内存对齐,总大小为 4字节(int)+1字节(char)+3字节(填充)+4字节(int) = 12 字节。
联合体的应用
例如:有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、职业、班级。教师的数据包括:姓名、职业、职务。要求用一个表格来完成。
#include<stdio.h>
struct Person
{
char name[32];
int age;
char occupation;
union {
int class;
char subject[32];
}mes;
};
int main()
{
struct Person arr[2];
int i;
for(i=0;i<2;i++){
printf("请问你是学生还是教师,是学生就输入s,是老师就输入t。\n");
scanf("%c",&(arr[i].occupation));
if(arr[i].occupation == 's'){
printf("请问你是几班的学生\n");
scanf("%d",&(arr[i].mes.class));
printf("请问学生的名字\n");
scanf("%s",arr[i].name);
}else{
printf("请问你教什么科目\n");
scanf("%s",arr[i].mes.subject);
printf("请问老师的名字\n");
scanf("%s",arr[i].name);
}
getchar();
}
for(i=0;i<2;i++){
if(arr[i].occupation == 's'){
printf("%s是%d班的学生\n",arr[i].name,arr[i].mes.class);
}else{
printf("%s是%s老师\n",arr[i].name,arr[i].mes.subject);
}
}
return 0;
}