引例
共用体
- 属于构造类型,包含多个不同类型的成员
- 又称 联合(体)
- 结构体成员占用不同的内存,互相独立
- 共用体所有成员占用同一段内存,修改一个成员会影响其他所有成员
union 共用体名{
成员列表;
};
定义共用体和共用体变量的三种方式
共用体内存布局
#include <stdio.h>
union data{
int n;
char ch;
short m;
};
int main(){
union data a;
printf("%d, %d\n", sizeof(a), sizeof(union data) );
a.n = 0x40;
printf("%d, %c, %d\n", a.n, a.ch, a.m);
a.ch = '9';
printf("%d, %c, %d\n", a.n, a.ch, a.m);
a.m = 0x2059;
printf("%d, %c, %d\n", a.n, a.ch, a.m);
a.n = 0x3E25AD54;
printf("%d, %c, %d\n", a.n, a.ch, a.m);
return 0;
}
DEMO
#include <stdio.h>
#define TOTAL 2
struct Person{
char name[20];
int num;
char sex;
char profession;
union{
float score;
char course[20];
} sc;
};
int main(){
int i;
struct Person persons[TOTAL];
for(i=0; i<TOTAL; i++){
printf("Input info: ");
scanf("%s %d %c %c", persons[i].name, &(persons[i].num), &(persons[i].sex), &(persons[i].profession));
if(persons[i].profession == 's'){
printf("请输入该学生成绩:");
scanf("%f", &persons[i].sc.score);
}else{
printf("请输入该老师课程:");
scanf("%s", persons[i].sc.course);
}
fflush(stdin);
}
printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");
for(i=0; i<TOTAL; i++){
if(persons[i].profession == 's'){
printf("%s\t\t%d\t%c\t%c\t\t%f\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.score);
}else{
printf("%s\t\t%d\t%c\t%c\t\t%s\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.course);
}
}
return 0;
}