前期回顾
结构体基础知识点(一)–建立自己的数据类型
结构体基础知识点(二)–使用结构体数组
结构体基础知识点(三)–结构体指针
结构体基础知识点(四)–用指针处理链表
共用体类型
1. 什么是共用体类型
用同一段内存单元存放不同类型的变量。而这种使几个不同的变量共享同一段内存的结构,称为 “共用体” 类型的结构。
2. 形式
union Data
{
int i;
char ch;
float f;
} a,b,c;
3. 引用共用体变量的方式
如 a.f ;
4. 共用体类型的数据特点
-
共用体与结构体非常相似,结构体变量所占内存长度等于各个成员占内存长度的和,每个成员分别占有自己的内存,而共用体变量所占内存长度等关于最长的成员的长度。
-
同一段内存可以存放几种不同类型的成员,但每一瞬间只能存放其中一个成员。
-
可以对共用体变量初始化,但初始化表中只能有一个常量,
union Data a = {16}
。 -
共用体变量中起作用的成员是最后一次被赋值的变量。
-
共用体变量的地址和它的各个成员的地址都是同一地址。
-
不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,如a = 1 不对。
-
可以使用共用体变量的指针做函数参数。
4. 栗子
有若干个人员的数据,其中有学生和教师。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来处理
输入
第一行有一个整数n,表示以下n行分别表示n个人员的数据。保证n不超过100。之后的n行,每行有5项用空格隔开的内容。前4项分别为人员的号码(整数)、姓名(长度不超过9的无空格字符串)、性别(字符,m或f)和职业(字符,s或t)。如果第4项是s,则第5项为一个整数,表示班级;如果第4项是t,则第5项为一个长度不超过9的无空格字符串,表示职务。
#include<stdio.h>
struct person {
int num;
char name[10];
char sex;
char job;
union {
int clas; //here class definited clas,因为class是标识符类
char position[10];
}category; // 成员category是共用体变量
}data[100];
int main(){
int n;
int i;
scanf("%d",&n);
for(i=0;i<n;i++){
printf("please enter the data of person:\n");
scanf("%d %s %c %c",&data[i].num,data[i].name,&data[i].sex,&data[i].job);
if(data[i].job=='s')
scanf("%d",&data[i].category.clas);
else if(data[i].job=='t')
scanf("%s",data[i].category.position);
else
printf("Error!\n");
}
printf("\n");
printf("No. name sex job class/position\n");
for (i = 0; i < n; i++)
{
if (data[i].job == 's')
printf("%-6d%-10s%-4c%-4c%-10d\n",data[i].num,data[i].name,data[i].sex,data[i].job,data[i].category.clas);
else
printf("%-6d%-10s%-4c%-4c%-10s\n",data[i].num,data[i].name,data[i].sex,data[i].job,data[i].category.position);
}
return 0;
}