看一个实际需求
现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓 名、编号、性别、职业、教学科目。请看下面的表格:
传统的方式来解决 定义结构体,根据人员的职业,使用对应的成员变量。
struct Person{
char name[20];
int num;
char sex;
char profession;
float score; // 学生使用 score
char course[20]; // 老师使用 course
} ;
传统方式的问题分析 : 会造成 空间的浪费 , 比如学生只使用 score ,但是 也占用了 course 成员的 20 个字节
解决方案
1)做 struct Stu 和 struct Teacher [但如果职业很多,就会对应多个结构体类型, 不利于管理]
2)使用共用体
基本介绍
1)共用体(Union)属于 构造类型,它可以包含多个类型不同的成员。和结构体非常类似, 但是也有不同的地方. 共用体有时也被称为联合或者联合体, 定义格式为
union 共用体名{
成员列表
};
2)结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员 占用同一段内存,修改一个成员会影响其余所有成员
快速入门
1)定义共用体的方式和结构体一样,都有三种方式
(1)
union data{
int n;
char ch;
double f;
};
union data a,b,c;
(2)
union data{
int n;
char ch;
double f;
}a,b,c;
(3)
union{
int n;
char ch;
double f;
}a,b,c;
2)案例演示
#include <stdio.h>
union data{ // data 就是一个共用体(内存布局), 包含三个成员, 共享数据空间, 该空间的大小以占用最大的成员为 准
int n;
char ch;
short m;
};
void main(){
union data a; //定义两个一个 共用体变量 a
printf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4, 4
a.n = 0x40;//16 进制
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);
}
最佳实践
现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓 名、编号、性别、职业、教学科目。请看下面的表格:, 请使用共用体编程完成.
代码演示:
#include <stdio.h>
#define TOTAL 2 //人员总数 (老师,学生,各两个人)
//定义了一个结构体 Person
//union MYUNION {
// float score;
// char course[20];
//};
struct Person {
char name[20]; //name
int num; //编号
char sex;//性别 f => 女 m=>男
char profession;//职员 s=>学生 t=>老师
union {
float score;
char course[20];
} sc;//sc 是一个共用体变量
};
void 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);
}
}
}