美文网首页C语言深度学习
C语言学习第11篇---union enum, sizeof,

C语言学习第11篇---union enum, sizeof,

作者: CodeAllen | 来源:发表于2019-06-07 20:34 被阅读0次
    0414.jpg

    说明:
    本文原创作者『Allen5G』
    首发于微信公众号『Allen5G』
    标签:嵌入式软件,算法,架构


    union相关总结

    定义联合体

    uniontest
    
    {
        intoffice;
        charteacher[5];
    };
    
    uniontestb;
    
    image.gif

    从这可以看出来,联合体内存是共享的,也就是只看那部分占用内存最大则联合体占用就是该内存

    相应的缺点就是操作office就会改变teacher的前四个字节的值

    根据这个特性,可以有一个妙用!

    uniontest
    {
         unsignedcharODR;
        struct
        {
              unsignedcharbit0:1,
    
                            bit1:1,
    
                            bit2:1,
    
                            bit3:1,
    
                            bit4:1,
    
                            bit5:1,
    
                            bit6:1,
    
                            bit7:1;
        };
    
    };
    
    uniontestc;
    
    image.gif

    这里联合体有两个成员,一个char ODR,还有一个8位的结构体,因为内存共享,这么着操作后边的结构体就可以改变ODR

    例如c.ODR = 0XFF,或者c.bit0 = 1:

    这就可以对ODR进行每一位进行赋值了


    第二个作用就是节约内存,在内存比较小的单片机内经常使用

    在STM8里定义

    uint8_t flag1=0;

    uint8_t flag2=0;

    uint8_t flag3=0;

    …………

    这么每一个flag会占用一个字节的ram空间

    要是使用union会节约空间

    union uflag
    {
         unsignedcharflag;
    
        struct
        {
              unsignedcharflag0:1,
    
                            flag1:1,
    
                            flag2:1,
    
                            flag3:1,
    
                            flag4:1,
    
                            flag5:1,
    
                            flag6:1,
    
                            flag7:1;
    
        };
    
    };
    
    union uflag flg;
    
    image.gif

    这么每个flag占用1bit,8个才占一个字节


    union的三种说明方式,基本与结构体一样

    1、
    
    uniontest
    
    {
    
       intnum;
    
       charstudent[4];
    
    };
    
    union testa,b;    //
    
    2、
    
    uniontest
    
    {
    
       intnum;
    
       charstudent[4];
    
    }a,b;                //
    
    3、
    
    union
    
    {
    
       intnum;
    
       charstudent[4];
    
    }a,b;               //
    
    image.gif

    enum : 枚举

    是C语言中的一种自定义类型

    值是可以根据需要自己定义的整型值

    第一个定义的enum值默认是0

    默认情况下的enum值是在前一个定义值得基础上加1

    enum类型的变量只能取定义时的离散值

    enum中定义的值是C语言中真正意义上的常量

    在工程中enum多用于定义整型常量

    实验一:enum的使用

    #include <stdio.h>
    enum
    {
        ARRAY_SIZE = 10
    };
    enum Color
    {
        RED    = 0x00FF0000,
        GREEN  = 0x0000FF00,
        BLUE   = 0x000000FF
    };
    void PrintColor(enum Color c)
    {
        switch( c )
        {
            case RED:
                printf("Color: RED (0x%08X)\n", c);
                break;
            case GREEN:
                printf("Color: GREEN (0x%08X)\n", c);
                break;
            case BLUE:
                printf("Color: BLUE(0x%08X)\n", c);
                break;
        }
    }
    void InitArray(int array[])
    {
        int i = 0;
    
        for(i=0; i<ARRAY_SIZE; i++)
        {
            array[i] = i + 1;
        }
    }
    void PrintArray(int array[])
    {
        int i = 0;
    
        for(i=0; i<ARRAY_SIZE; i++)
        {
            printf("%d\n", array[i]);
        }
    }
    int main()
    {
        enum Color c = GREEN;
    
        int array[ARRAY_SIZE] = {0};
    
        PrintColor(c);
    
        InitArray(array);
    
        PrintArray(array);
    
        return 0;
    }
    
    image.gif

    sizeof :

    sizeof是编译器的内置指示符

    sizeof用于计算类型或变量所占的内存大小

    sizeof的值在编译器就已经确定

    用于类型: sizeof(type)

    用于变量: sizeof(var)或sizeof var

    注意:

    sizeof 是C语言的内置关键字而不是函数

    - 在编译过程中所有的sizeof将被具有的数值所替换

    - 程序的执行过程与sizeof没有任何关系

    实验2:sizeof的本质

    #include <stdio.h>
    int f()
    {
        printf("Delphi Tang\n");
    
        return 0;
    }
    int main()
    {
        int var = 0;
    
        int size = sizeof(var++);
    
        printf("var = %d, size = %d\n", var, size);
    
        size = sizeof(f());
    
        printf("size = %d\n", size);
    
        return 0;
    }
    
    image.gif

    typedef:面试的时候可能被问到哦

    用于给一个已经存在的数据类型重命名

    本质上不能产生新的类型

    重命名的类型:

    - 可以在type语句之后定义

    - 不能被unsigned 和 signed 修饰

    typedef type new_name

    实验3:typedef使用实例

    #include <stdio.h>
    typedef int Int32;
    struct _tag_point
    {
        int x;
        int y;
    };
    typedef struct _tag_point Point;
    typedef struct
    {
        int length;
        int array[];
    } SoftArray;
    typedef struct _tag_list_node ListNode;
    struct _tag_list_node
    {
        ListNode* next;
    };
    int main()
    {
        Int32 i = -100;        // int
        //unsigned Int32 ii = 0;
        Point p;               // struct _tag_point
        SoftArray* sa = NULL;  
        ListNode* node = NULL; // struct _tag_list_node*
    
        return 0;
    }
    
    image.gif

    小结:

    enum用于定义离散值类型

    enum定义的值是真正意义上的常量

    sizeof是编译器的内置指示符

    sizeof不参与程序的执行过程

    typedef用于给类型重命名

    - 重命名的类型可以在typedef语句之后定义

    相关文章

      网友评论

        本文标题:C语言学习第11篇---union enum, sizeof,

        本文链接:https://www.haomeiwen.com/subject/hwuvxctx.html