共用体
基本介绍
-
共用体(Union)属于构造类型,它可以包含多个类型不同的成员。和结构体非常类似,但是也有不同的地方。
-
共用体有时也被称为联合或者联合体,定义格式为
union 共用体名{ 成员列表 }
-
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
快速入门
- 定义共用体类型和共用体变量的三种方式(和结构体一样)
-
先定义共用体数据类型再定义共用体变量
union data{ int n; char ch; double f; }; union data a,b,c
-
定义共用体数据类型的同时定义共用体变量
union data{ int n; char ch; double f; }a,b,c;
-
匿名共用体
union{ int n; char ch; double f; }a,b,c;
-
案例演示
#include<stdio.h> union data{ //data就是一个共用体(内存布局),包含三个成员,共享数据空间,该空间的大小以占用最大的成员为准 int n; char ch; short m; } int main(){ union data a; //定义一个共用体变量a printf("%d,%d\n",sizeof(a),sizeof(union data)); //两个值均为int类型占用的空间大小 a.n = 0x40; //16进制 //仅给a.n赋了值,但是a.ch、a.m也有值,原因在于共用体结构的内存布局 printf("%d,%c,%d\n",a.n,a.ch,a.m); a.ch = '9'; //改变了a.ch的值后,a.n、a.m的值也发生了变化 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); getchar(); return 0; }
最佳实践
现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格;请使用共用体编程完成。
#include<stdio.h>
#define TOTAL 2 //人员总数
//union MyUnion{
// float score;
// char course[20];
//}sc; //sc是一个共用体变量
//定义了一个结构体 Person
struct Person{
char name[20]; //name
int num; //编号
char sex; //性别 f=>女 m=>男
char profession;//职业 s=>学生 t=>老师
union{
float score;
char course[20];
}sc; //sc是一个共用体变量
// union MyUnion 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%f\n",persons[i].name,persons[i].num,persons[i].sex,persons[i].profession,persons[i].sc.course);
}
}
}