• DAY 12 结构体 共用体 枚举02


    1.结构体

    结构体对齐(了解)

    概述

    typedef struct Data01
    {
    char a;
    int b;
    }Data01;
    typedef struct Data02
    {
    char a;
    char b;
    }Data02;
    void fun01(){
    printf("%ld\n",sizeof(Data01));
    printf("%ld\n",sizeof(Data02));
    }
    特点:
    不对齐
                    优点:占用空间小
                    缺点:速度慢
    对齐
                    优点:速度快
                    缺点:占用空间大
    注意
            如果在结构体中出现了数组,数组可以看成多个变量的集合
    自动对其原则
    原则
    1, 结构体中的第一个成员在与结构体变量 , 偏移量为 0 的地址处
    2, 确定结构体的分配单位(结构体体中最大的基本类型长度)
    3, 其他成员的偏移量 == 成员自身长度的整数倍
    4, 收尾工作:结构体的总大小 == 分配单位的整数倍。
    注意 : 按成员顺序从上向下
    示例
    typedef struct Data01
    {
    char a;
    int b;
    }Data01;
    typedef struct Data02
    {
    char a;
    char b;
    }Data02;
    typedef struct Data03
    {
    char a;
    short b;
    int c;
    }Data03;
    typedef struct Data04
    {
    char a;
    short b;
    Data01 c;
    int d;
    }Data04;
    强制对齐原则
            #pragma pack (value)时的指定对齐值 value 1 2 4 8
    示例
    #pragma pack(1)
    typedef struct data05
    {
    char c;
    int a;
    }Data05;
    void fun02()
    {
    printf("%ld\n",sizeof(Data05));
    }
    位域
    概述
    结构体的成员以二进制位位单位存储,这种就叫位域 ( 位段 )
    unsigned int a:2; 表示 a 只占 int 类型中 2 位二进制位。 a 的类型还是 unsigned int
    abcd 叫相邻位域,可以压缩。不能超过自身类型大小。
    注意:
            
    1 、不能对位域取地址
    2 、给位域赋值 不要超过位域的大小(会溢出)
    示例:
            
    typedef struct data06
    {
    unsigned char a:2;
    unsigned char b:2;
    unsigned char c:2;
    unsigned char d:2;
    }Data06;
    void fun03()
    {
    printf("%ld\n",sizeof(Data06));// 长度 1 字节
    }
    示例 2: 另起一个单元存储
    typedef struct data07
    {
    unsigned char a:2;
    unsigned char b:2;
    unsigned char c:2;
    unsigned char :0;
    unsigned char d:2;
    }Data07;
    void fun04()
    {
    printf("%ld\n",sizeof(Data07));// 长度 2
    }
    示例 3: 无意义位段
    typedef struct data08
    {
    unsigned char a:2;
    unsigned char b:2;
    unsigned char :2;
    unsigned char d:2;
    }Data08;
    void fun05()
    {
    printf("%ld\n",sizeof(Data08));// 长度 1
    }

    2.共用体

    关键字 :union
    特点:
             所有成员共用一块空间
    示例:
    //a b c 共用同一块空间(最大的成员类型决定)。
    union Data09
    {
    char a;
    short b;
    int c;
    };
    void fun06()
    {
    union Data09 d01;
    printf("%ld\n",sizeof(d01));// 长度 4
    }
    虽然共用体成员在同一块空间,但是每个成员操作空间的大小 是由成员自身类型决定。
    示例2:
    union Data09
    {
    char a;
    short b;
    int c;
    };
    void fun07()
    {
    union Data09 d01;
    d01.a = 10;
    d01.b = 20;
    d01.c = 30;
    printf("%d\n",d01.a+d01.b+d01.c);
    }

    示例3:

    union Data09
    {
    char a;
    short b;
    int c;
    };
    void fun08()
    {
    union Data09 d01;
    d01.a = 0x01;
    d01.b = 0x0102;
    d01.c = 0x01020304;
    printf("%d\n",d01.a+d01.b+d01.c);
    }

    3.枚举

    关键字 :enum
    特点
            限定其值的范围
    概念 : 枚举就是将枚举变量可以赋的值一一列举出来
    语法
            
    enum 枚举名称
    {
    1,
    2,
    3,
    ...
    n
    }
    注意 :
    枚举中的值为符号常量 , 也是枚举变量可以赋的值
    枚举列表中的值从 0 递增
    示例1:
    enum Type
    {
    OK,
    ERROR,
    OVER
    };
    void fun08()
    {
    enum Type t1 = OK;
    enum Type t2 = ERROR;
    enum Type t3 = OVER;
    printf("%d %d %d\n",OK,ERROR,OVER);
    }
    示例2:
    enum Type2
    {
    NUM01,
    NUM02 = 3,
    NUM03
    };
    void fun09()
    {
    enum Type2 t1 = NUM01;
    enum Type2 t2 = NUM02;
    enum Type2 t3 = NUM03;
    printf("%d %d %d\n",NUM01,NUM02,NUM03);
    }
  • 相关阅读:
    Vue、React和小程序中的组件通信:父传子和子传父
    Sqlserver修改表结构报阻止保存要求重新创建表的更改
    【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL
    2022 (第五届)GIS软件技术大会开幕,GIS、IT将加速融合
    京东技术专家的修炼之道|“六边形战士”周默分享
    图扑软件 3D 组态编辑器,低代码零代码构建数字孪生工厂
    MATLAB解析和保存ini文件
    系统架构:软件工程速成
    深度学习-卷积神经网络
    散文:dflow 是如何实现slice的
  • 原文地址:https://blog.csdn.net/aisheisadas/article/details/134274615