联合类型及其应用

 一、联合引入
 有时在编程中,可能需要定义多个结构体类型,可能每个类型大体相同,只有微小差异,例如个人信息,包含职业,年龄,家庭地址,假设职业不同,就定义不同的结构体,这些结构体中大部分数据信息相同,如果人数较多,信息元素也复杂,此种情况下定义结构体相对来说就会加大工作量。
 例如构造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;

} 

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值