共用体笔记

共用体

基本介绍

  • 共用体(Union)属于构造类型,它可以包含多个类型不同的成员。和结构体非常类似,但是也有不同的地方。

  • 共用体有时也被称为联合或者联合体,定义格式为

    union 共用体名{
        成员列表
    }
    
  • 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

快速入门

  1. 定义共用体类型和共用体变量的三种方式(和结构体一样)
  • 先定义共用体数据类型再定义共用体变量

    union data{
        int n;
        char ch;
        double f;
    };
    union data a,b,c
    
  • 定义共用体数据类型的同时定义共用体变量

    union data{
        int n;
        char ch;
        double f;
    }a,b,c;
    
  • 匿名共用体

    union{
        int n;
        char ch;
        double f;
    }a,b,c;
    
  1. 案例演示

    #include<stdio.h>
    
    union data{	//data就是一个共用体(内存布局),包含三个成员,共享数据空间,该空间的大小以占用最大的成员为准
    	int n;
        char ch;
        short m;
    }
    
    int main(){
        union data a;	//定义一个共用体变量a
        printf("%d,%d\n",sizeof(a),sizeof(union data));	//两个值均为int类型占用的空间大小
        a.n = 0x40;	//16进制
        //仅给a.n赋了值,但是a.ch、a.m也有值,原因在于共用体结构的内存布局
        printf("%d,%c,%d\n",a.n,a.ch,a.m);
        a.ch = '9';
        //改变了a.ch的值后,a.n、a.m的值也发生了变化
        printf("%d,%c,%d\n",a.n,a.ch,a.m);
        a.m = 0x2059;
        printf("%d,%c,%d\n",a.n,a.ch,a.m);
        a.n = 0x3E25AD54;
        printf("%d,%c,%d\n",a.n,a.ch,a.m);
        getchar();
        return 0;
    }
    

最佳实践

现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格;请使用共用体编程完成。

在这里插入图片描述

#include<stdio.h>
#define TOTAL 2	//人员总数


//union MyUnion{
//    float score;
//    char course[20];
//}sc;	//sc是一个共用体变量

//定义了一个结构体 Person
struct Person{
    char name[20];	//name
    int num;		//编号
    char sex;		//性别 f=>女 m=>男
    char profession;//职业 s=>学生 t=>老师
    union{
        float score;
        char course[20];
    }sc;	//sc是一个共用体变量
//    union MyUnion sc;
}
int main(){
    int i;
    struct Person persons[TOTAL];	//定义了一个结构体数组
    //输入人员信息
    for(i = 0; i < TOTAL; i++){
        printf("Input info:");
        scanf("%s %d %c %c",persons[i].name,&(persons[i].num),&(persons[i].sex),&(persons[i].profession));
        if(persons[i].profession == 's'){	//如果是学生
            printf("请输入该学生成绩:");
            scanf("%f",&persons[i].sc.score);
        }else{	//如果是老师
            printf("请输入该老师课程:");
            scanf("%s",persons[i].sc.course);
        }
        fflush(stdin);	//刷新输入,保证数据被写入结构体中
    }
    
    //输出人员信息
    printf("\nName\t\tNum\tSex\tProfession\tScore/Course\n");
    for(i = 0; i < TOTAL; i++){
        if(persons[i].profession == 's'){	//如果是学生
            printf("%s\t\t%d\t%c\t%c\t\t%f\n",persons[i].name,persons[i].num,persons[i].sex,persons[i].profession,persons[i].sc.score);
        }else{	//如果是老师
            printf("%s\t\t%d\t%c\t%c\t\t%f\n",persons[i].name,persons[i].num,persons[i].sex,persons[i].profession,persons[i].sc.course);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值