8月22日笔记C语言基础(补4)联合体与枚举2

1.联合体问题引入?
    如果一个学生选修课,选择了美术,就不能选择音乐
    如何描述这些互斥的场景呢?用结构体?当然不合适,还有就是空间问题?
    答案是联合体(共用体)
    
2.联合体的基本概念?
    联合体和结构体的结构非常相似,但是有一个本质的区别:
    结构体的每一个成员都是相互各自独立的,而联合体的每个成员都是共用一块内存
    因此联合体又称为共用体。
    
3.联合的定义
    union 联合体名
    {
        成员类型1 成员1;
        成员类型2 成员2;
        ...
    };
    语言:联合体名是用来区分不同的联合体
    成员 是包含在联合体内部的数据,可以是任意数据类型
    例子:

union data
    {
        int x;
        char y;
        double z;
    };

4.联合体初始化
    // 普通初始化,只有第一个有效,后面的就无效了,编译会警告,只能初始化第一个成员

 //union data udata = {'k',18,3.14};
    union data udata = {'k'};
    printf("%c,%d,%f\n",udata.x,udata.y,udata.z);

   // 指定成员初始化,只有最后一个成员有效

    union data udata1 = {.x = 'a', .y = 20, .z = 3.14};
    printf("%c,%d,%f\n",udata1.x,udata1.y,udata1.z);

   // 联合体成员的引用,如果都给成员赋值默认输出的是空间的最大值数据
    // 输出3.14

    union data udata2;
    udata2.x = 'b';
    udata2.y = 100;
    udata2.z = 3.14;
    printf("%c,%d,%f\n",udata2.x,udata2.y,udata2.z);

   //联合体指针

    union data *pdata = &udata2;
    pdata->x = 'c';
    pdata->y = 200;
    pdata->z = 4.15;
    printf("%c,%d,%f\n",pdata->x,pdata->y,pdata->z);

5.联合体的内存大小为成员的最大值,如上union data的大小为8字节
    
6.联合体使用场景    
    联合体一般不会单独使用,而是以结构体的成员方式存在,用来表示互斥的效果,即一次只能赋予一个值
    用来表示某种互斥属性,比如学生选修课

    struct student
    {
        char name[20];
        int age;
        union cur
        {
            int yuwen;
            float shuxue;
            double yinyu;
        }d;
    };
    
    int main()
    {
        struct student st[2];
        strcpy(s[0]t.name,"jack");
        st[0].age = 18;
        st[0].d.yuwen = 1;
        
        printf("%d\n",st[0].d.yuwen);
        
        strcpy(s[1]t.name,"rose");
        st[1].age = 19;
        st[1].d.shuxue = 1.1;
        
        printf("%f\n",st[1].d.shuxue);
        
    }



1.枚举类型问题引入
    char 1字节 -128---127  0---255,但是有些时候我们不用这么多数据
    比如一周的工作时间,周一到周五 5个数据,有什么数据类型可以描述这场景
    答案是枚举类型
    
2.枚举的定义
    enum 枚举类型名{枚举元素列表}
    enum           {枚举元素列表}
    例子:
    enum weekday{mon,tue,wed,thu,fri};
    
3.枚举成员引用
    enum weekday workday = mon;
    
4.枚举的使用场景dmeo

    enum weekday{mon,tue=100,wed=99,thu,fri};

    enum {up,down,left,right};

    enum {red=0xff0000,green=0x00ff00,blue=0x0000ff};

    int func()
    {
        return up;
    }

    int main()
    {
        enum weekday workday = wed;
        printf("%d,%d,%d,%d,%d,%d\n",mon,tue,wed,thu,fri,workday);
        // 枚举的使用场景
        if(func() == up)
        {
            printf("up\n");
        }
        
        int color;
        switch(color)
        {
            case red:
                printf("处理红色\n");
                break;
            case green:
                printf("处理绿色\n");
                break;
            case blue:
                printf("处理蓝色\n");
                break;
        }
        
        return 0;
    }

总结:
enum weekday{mon,tue,wed,thu,fri}; // mon = 0,tue = 1,wed = 2,thu = 3,fri = 4
1.枚举第一个值默认为0
    比如mon为0,后面的大小依以此类推 1,2,3,4
    
2.如果枚举变量里面某个成员设置了数值,往后的其它成员的数值在它基础上进行累加
    enum weekday{mon,tue=100,wed,thu,fri}; // mon = 0,tue = 100,wed = 101,thu = 102,fri = 103
    
3.枚举常量实际就是一个整型,首个枚举常量默认为0

4.枚举在c语言的作用是增加代码的可读性    
    



    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值