联合类型及其应用

来源:互联网 发布:linux 网络连接日志 编辑:程序博客网 时间:2024/04/26 04:16
 一、联合引入 有时在编程中,可能需要定义多个结构体类型,可能每个类型大体相同,只有微小差异,例如个人信息,包含职业,年龄,家庭地址,假设职业不同,就定义不同的结构体,这些结构体中大部分数据信息相同,如果人数较多,信息元素也复杂,此种情况下定义结构体相对来说就会加大工作量。 例如构造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-yearsvoid 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;} 

运行结果如下图:
这里写图片描述

原创粉丝点击