一、联合引入
有时在编程中,可能需要定义多个结构体类型,可能每个类型大体相同,只有微小差异,例如个人信息,包含职业,年龄,家庭地址,假设职业不同,就定义不同的结构体,这些结构体中大部分数据信息相同,如果人数较多,信息元素也复杂,此种情况下定义结构体相对来说就会加大工作量。
例如构造3个结构,这3结构定义的变量分别用于指代不同数据信息,但3个结构有3个相同类型的成员变量,有一个不同的成员变量;只因为有一个成员变量不同要花出“构造三个不同结构类型”的代价,有些不值得。
二 联合:
1.定义联合类型的变量(2种方式):
(2)构造好联合以后,使用union和联合类型名定义结构变量
union try_union
{
int i;
double d;
char c;
};
union try_union un1;
(2)构造联合类型的同时定义联合变量
union try_union
{
int i;
double d;
char c;
}un2;
2.联合类型变量的赋值(初始化)
(1)联合类型的所有变量都指代相同存储空间的数据,所以只对其中一个初始化即可,C语言规定:要初始化联合类型的变量,只能选择初始化第一个成员变量。
union try_union
{
int i;
double d;
char c;
}un1 = { 10 };//或 union try_union un1={10};
//(2)使用赋值运算符
un1.d=1.234
3.注意:联合类型的成员变量都指代同一存储空间中的数据,所以后赋的值会覆盖前面的值。
联合类型变量的特殊性: (1)所有成员指代同一数据(2)为正确读到数据,应使用最后赋值的变量读取数据。
代码如下:
union un//联合体 存放它们不同的成员变量
{
short grade;
char title;
char work_years;
};
struct person_info//结构体,基本信息
{
char name;
char sex;
short age;
char profession;
union un un1;
};
//规定profession指代字符s时引用联合成员un1.grade,t时引用联合成员un1.title,c时引用联合成员 un1.work-years
void print_info(int n, struct person_info *p)//打印信息函数
{
puts("name\t sex\t age\t job\t grade/title/work_ages");
for (int i = 0; i < n; i++)
{
printf("%2c\t%c\t%hd\t%c\t", p->name, p->sex, p->age, p->profession);
if (p->profession == 's')
{
printf("%t\%hd\n", p->un1.grade);
}
if (p->profession == 't')
{
printf("%t\%c\n", p->un1.title);
}
if (p->profession == 'c')
{
printf("%t\%hd\n", p->un1.work_years);
}
p++;
}
}
void TestUnion()
{
puts("\t---Informations of all people--\n");
struct person_info per[] = {
{ 'J', 'm', 20, 's' },
{ 'B', 'm', 21, 's' },
{ 'M', 'w', 21, 's' },
{ 'I', 'w', 20, 's' },
{ 'Y', 'w', 29, 't' },
{ 'C', 'w', 27, 't' },
{ 'W', 'm', 39, 'c' },
};
per[0].un1.grade = 3;
per[1].un1.grade = 2;
per[2].un1.grade = 2;
per[3].un1.grade = 3;
per[4].un1.title = 'S';
per[5].un1.title = 'G';
per[6].un1.work_years = 4;
print_info(7, per);//打印这7个人的信息
puts("\t-- * The infomations about the blank * --");
puts("Job: \t 's'--- student \n\t't'--- tescher \n\t'c'---cleaner");
puts("grade: \t 1~4");
puts("title: \t'S'---Superior\n\t 'G'---General");
puts("work_years:\t 1~10");
printf("\n");
}
int main()
{
TestUnion();
system("pause");
return 0;
}
运行结果如下图: