• C语言---08自定义数据类---02共用体union与枚举enum


    二、共用体类型 union

    (一)定义

    • 所有数据成员共用一段内存的数据类型

    • 只占用一段内存,一次赋一个值

    • 共用体变量中起作用的成员最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖

    (二)共用体和结构体的区别

    • 定义和声明的形式和成员引用的方法是一样的

    • 结构体所有的成员拥有独立的空间

    1. struct stu
    2. {
    3. char a;
    4. short b;
    5. int c;
    6. }; // a b c成员有用独立的空间

     

    • 共用体所有的成员共享同一份空间

    1. union stu
    2. {
    3. char a;
    4. short b;
    5. int c;
    6. }; // a b c成员共享同一份空间

    (三)共用体所占内存大小

    • 以最大的数据成员所占内存大小为准,也会存在内存对齐

    1. union U {
    2. char a;
    3. short b;
    4. int c;
    5. };
    6. printf("%d\n", sizeof(union U)); // 4
    赋值时,都存储在第一个字节,所以是最后一次赋值有效,是巧合
    • 共用体是最后一次赋值有效(不严谨)

    • 共用体虽然共有同一份空间,但是从空间读取的字节数是由成员自身类型决定

    • 对上述代码来说,a能读取1字节,b能读取2字节,c能读取4字节

    1. union data
    2. {
    3. char a;
    4. short b;
    5. int c;
    6. };
    7. void test05()
    8. {
    9. union data A;
    10. printf("%d\n",sizeof(union data)); // 4
    11. A.c = 0x01020304;
    12. A.b = 0x0102;
    13. A.a = 0x01;
    14. printf("%#x\n", A.a+A.b+A.c); // 0x01020203
    15. }

    三、枚举类型 enum

    (一)定义

    • 把所有可能的取值都列举出来的一种数据类型,可以理解成取值范围有限的整型

    • 枚举值表中应列出所有可用值,也称为枚举元素

    • 枚举变量仅能取枚举值所列元素

    1. enum 枚举名
    2. {
    3. 枚举值表
    4. };

    (二)枚举值

    • 枚举值是常量,不能在程序中用赋值语句再对它赋值

    1、枚举值用整型的方式处理

    • 如果没有指定枚举元素的值,枚举值默认从0开始

    • 可以在枚举类型声名时指定枚举元素的枚举值

    • 如果指定了部分枚举元素的枚举值,在其之后没有指定枚举值的枚举元素默认在前一个枚举元素的基础上+1

    1. enum Weekday { sun = 7, mon = 1, tue, wed, thu, fri, sat = 6 };
    2. enum Weekday workday, weekend; // 这里在声明后定义了两个enum Weekday枚举类型的变量workday和weekend
    3. enum Weekday { sun, mon, tue, wed, thu, fri, sat }workday, weekend; // 在声明时定义变量

    2、枚举变量只能接受枚举类型数据

    workday = (Weekday)2; // 强制转换类型,并赋值为2

    (三)组成

    • enum是枚举类型的关键字

    • Weekday是枚举类型的类型名

    • sun,mon,tue,wed,thu,fri,sat是枚举元素(枚举成员),枚举值默认从0开始

    • workday、weekend是枚举类型变量

    1. enum Weekday { sun = 7, mon = 1, tue, wed, thu, fri, sat = 6 };
    2. enum Weekday workday,weekend; // 星期枚举类型变量workday、weekend
    3. workday = wed;
    4. printf("%d\n", workday); // 3
    5. enum Weekday Weekend[2] = { sun, sat }; // 枚举数组
    6. enum Weekday Workend[5] = { mon, tue, wed, thu, fri };
    7. enum Weekday Today = wed;
    8. switch (Today) // 枚举类型可以作为条件进行比较
    9. {
    10. case sun: printf("今天是星期天,可以玩游戏!\n"); break;
    11. case mon: printf("今天是星期一,上班第一天!\n"); break;
    12. case tue: printf("今天是星期二,上班继续!\n"); break;
    13. case wed: printf("今天是星期三,上班中!\n"); break;
    14. case thu: printf("今天是星期四,还在上班中!\n"); break;
    15. case fri: printf("今天是星期五,摸鱼中!\n"); break;
    16. case sat: printf("今天是星期六,可以睡懒觉!\n"); break;
    17. }
    • 游戏玩家的上下左右操作也可以使用枚举来完成

    1. enum dir{ 上 = 'w', 下 = 's', 左 = 'a', 右 = 'd' }; // 方向枚举类型 范围内取值
    2. enum dir PlayerDir; // 玩家移动的方向
    3. while (1)
    4. {
    5. switch (PlayerDir = getchar())
    6. {
    7. case 上: printf("玩家向上移动!\n"); break;
    8. case 下: printf("玩家向下移动!\n"); break;
    9. case 左: printf("玩家向左移动!\n"); break;
    10. case 右: printf("玩家向右移动!\n"); break;
    11. }
    12. }

  • 相关阅读:
    GO并发编程基础- 如何使用channel
    学习记录627@python机器学习之神经网络分类算法
    shell脚本相关基础操作汇总
    Go语言Web开发Echo框架搭建
    视频监控智能分析技术
    1996-2023年各省农林牧渔总产值及农业、林业、牧业、渔业总产值数据(无缺失)
    【python】bin/dec/hex/bnr进制转换函数及fp32转十六进制
    【跟小嘉学 Rust 编程】三十一、Rust的日志与追踪
    excel筛选后求和
    Spring MVC程序开发@RequestMapping 注解介绍
  • 原文地址:https://blog.csdn.net/soaipipiop/article/details/127103239