写在前面
- 共用体类型就是,把几个变量储存在同一个地址开始的内存种,用到了覆盖技术,后一个数据覆盖前面的数据
union 共用体名
{
成员列表
}变量列表
声明定义方式与结构体类型变量一致,初始化方式不同。结构体变量可以给出初始化表一次性全部初始化,但是共用体变量一次只能初始化一个变量成员。
union Data
{
int i;
char ch;
float score;
}
这说明共用体可以存放三种数据,但是每一瞬时只能存一种数据,而且如果对其成员初始化的化,留下的是最后赋值的哪一个,前边赋值的变量会被覆盖,比如
union Data a;
a.i=1;
a.ch="A";
a.score=99.0;
如果输出a.i就不会是1;
-
不能直接引用共用体变量但是可以引用成员,这一点与结构体也一样,因为结构体和共用体变量里边存储不同了不同类型的变量,出储存区按不同类型存放数据,有不同的长度,如果直接引用变量名,系统不知道输出哪一个成员。
-
共用体变量的地址和其成员的地址是同一个地址。
何时用
在数据处理的时候,有时候需要对一段空间安排不同的用途,这时候用共用体数据比较方便,增加程序的灵活性。
例题
若干人员,包含老师和学生。老师信息包括学号,名字,性别和职务。学生信息包括学号,名字,姓名和班级。这个时候班级和职务就可以用共用体
#include<stdio.h>
struct
{
int num;
char name[20];
char sex;
char job;
union
{
int clas;
char position[20];
}category;
}people[2];
int main()
{
int i,j;
printf("please inout information:\n");
for (i = 0; i < 2; i++)
{
scanf_s("%d", &people[i].num);
scanf_s("%s", people[i].name,sizeof(people[i].name));
scanf_s("%c",&people[i].sex,sizeof(&people[i].sex));
scanf_s("%c",&people[i].job,sizeof(&people[i].job));
for (j = 0; j < 10000; j++);
if (people[i].job == 's')
{
printf("请输入班级:");
scanf_s("%d", &people[i].category.clas);
}
else if (people[i].job == 't')
{
printf("请输入职务:");
scanf_s("%c", &people[i].category.position, sizeof(people[i].category.position));
}
else
printf("this is an error");
}
printf("output\n");
printf("num name sex job class/position");
for (i = 0; i < 2; i++)
{
if (people[i].job == 's')
{
printf("%d %s %c %c %d", people[i].num, people[i].name, people[i].sex, people[i].job, people[i].category.clas);
}
else
printf("%d %s %c %c %c", people[i].num, people[i].name, people[i].sex, people[i].job, people[i].category.position);
}
}
有些错误但是意思到了