基本介绍
- 共用体属于构造类型,它可以包含多个类型不同的成员
- 共用体有时也被称为联合或者联合体
union 共用体名{
成员列表
};
- 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
#include <stdio.h>
union data{ // data 就是一个共用体(内存布局), 包含三个成员, 共享数据空间, 该空间的大小以占用最大的成员为准
int n;
char ch;
short m;
};
void main(){
union data a; //定义两个一个 共用体变量 a
//sizeof(a)表示共用体占用的空间,sizeof(union data) 也是
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);//64 @ 64
a.ch = '9'; //9的ASCII码值是57
printf("%d, %c, %d\n", a.n, a.ch, a.m);//57 9 57
a.m = 0x2059;
printf("%d, %c, %d\n", a.n, a.ch, a.m);//8281 Y 8281
a.n = 0x3E25AD54;
printf("%d, %c, %d\n", a.n, a.ch, a.m);//1042656596 T -21164
getchar();
}
共用体所占的内存空间大小为4字节(int)
但是char类型只占1个字节,short类型占用2字节,所以我们只输出最后的一个或两个字节的内容,但是修改输入数据的时候,是按照最大的字节长度来输入的
共用体的实践
定义一个结构体数组
struct Person persons[TOTAL]; // 定义了一个结构体数组
共用体的定义及输出
union{
float score;
char course[20];
} sc;//sc 是一个共用体变量
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);
}
#define _CRT_SECURE_NO_WARNINGS
#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 是一个共用体变量
//union MYUNION 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);
}
}
getchar();
getchar();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83258.html