共用体
与构造体类似,也是一种构造类型的数据结构,在同一个存储空间存储不同数据的类型。
共用体的特点是:所有成员共用内存空间,开辟单位以数据类型最长的为准,大小是容量最大的成员向上取基本单位的整数倍 。
再看另外一个例子,共用体内定义了一个char变量,开辟了四个字节,还有一个int变量,查看空间大小输出的结果为4。这就验证了上面所说的开,辟单位以数据类型最长的为准,大小是容量最大的成员向上取基本单位的整数倍 。
但是一旦将char类型变量开辟了四个以上的字节,开辟的空间就会发生变化,如下图:
共用体变量中的成员的值是最后一次存放的成员确定的,在存入一个新的成员的值后原有的成员的值会被覆盖。
关于结构体和共用体的练习
#include <stdio.h>
#define SIZE 5
//1. 声明共用体
typedef union{
int s_class;
char position[10];
}Utech;
//2.声明结构体
typedef struct{
int num;
char name[20];
char chsex;
char chjob;
//联合体的定义很关键
Utech type;
}Person;
void input(Person *pin_arr, int n)
{
int i;
for(i=0;i<n;i++)
{
printf("依次输入num、name、sex、job、type,用空格分隔\n");
scanf("%d %s %c %c",&((pin_arr+i)->num),(pin_arr+i)->name,\
&((pin_arr+i)->chsex),&((pin_arr+i)->chjob));
if((pin_arr+i)->chjob=='s')
{
scanf("%d",&((pin_arr+i)->type.s_class));
getchar();
}
else if((pin_arr+i)->chjob=='t')
{
scanf("%s",&((pin_arr+i)->type.position));
getchar();
}//以下可以扩充 ,本else仅供参考
else
{
printf("职业输入错误\n");
}
}
}
/*
功能:实现对结构体数组的数据打印输出
参数:Person *pin_arr 接收结构体的首地址
int n 数组大小
返回值:无
*/
void print(Person *pout_arr, int n)
{
int i;
for(i=0;i<n;i++)
{
printf("num=%d-name=%s-sex=%c-job=%c-",(pout_arr+i)->num, \
(*(pout_arr+i)).name,(*(pout_arr+i)).chsex,(*(pout_arr+i)).chjob);
if((pout_arr+i)->chjob=='s')
{
printf("type=%d\n",(*(pout_arr+i)).type.s_class);
}
else if((pout_arr+i)->chjob=='t')
{
printf("type=%s\n",(*(pout_arr+i)).type.position);
}
}
}
int main()
{
Person person[SIZE];
input(person,SIZE);
print(person,SIZE);
return 0;
}