• 第11课 enum、sizeof、typedef 分析


    1. enum枚举类型

    1.1 使用方法

    (1)enum是C语言中的一种自定义类型

    (2)enum值是可以根据需要自定义的的整型值

    (3第一个定义的enum值默认为0

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

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

    enum Color
    {
        GREEN,      //默认GREEN==0;
        RED= 2,     //自定义RED==2;
        BLUE         //默认情况,是在前一个的基础上加1,即BLUE==3
    };
    
    enumColor c =GREEN;//定义c变量,并初始化为GREEN
    
    printf("%d
    ",c);

    1.2 枚举类型的特殊意义

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

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

    【实例分析】enum的使用

    #include <stdio.h>
    
    enum                   //无名枚举,用于定义常量
    {
        ARRAY_SIZE = 10    //定义数组大小,ARRAY_SIZE是常量,运行时无法改变
    };
    
    enum Color
    {
        RED    = 0x00FF0000,
        GREEN  = 0x0000FF00,
        BLUE   = 0x000000FF  //注意,后面没分号
    };
    
    //打印,参数为枚举类型
    void PrintColor(enum Color c)
    {
        switch( c )
        {
            case RED:
                printf("Color: RED (0x%08X)
    ", c);
                break;
            case GREEN:
                printf("Color: GREEN (0x%08X)
    ", c);
                break;
            case BLUE:
                printf("Color: BLUE(0x%08X)
    ", 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
    ", array[i]);
        }
    }
    
    int main()
    {
        enum Color c = GREEN; //定义变量c并初始化为GREEN
        
        int array[ARRAY_SIZE] = {0};
        
        PrintColor(c);
        
        InitArray(array);
        
        PrintArray(array);
        
        return 0;
    }

    2. sizeof关键字的用法

    2.1 sizeof简介

    (1)sizeof是编译器的内置指示符

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

    (3)sizeof的值在编译期就己经确定

    2.2 为sizeof关键字正名——sizeof是C语言的内置关键字而不是函数

    (1)在编译过程中所有的sizeof将被具体的数值所替换

    (2)程序的执行过程与sizeof没有任何关系

    int var =0;
    
    int size = sizeof(var++); //在编译期,该行的size值就被计算出来了,并
                              //被替换为类似int size=4;这样的语句。即己经
                              //最终的代码己经没有var++的语句了。(注意,
                              //var++可看作是var = var+1;所以sizeof(var++)
                              //相当于计算最终的变量var的大小)。
    printf("var = %d, size = %d
    ",var,size); //输出0,4。而不是1,4;

    【编程实验】sizeof的本质

    #include <stdio.h>
    
    int f()
    {
        printf("I like programming!
    ");
        
        return 0;
    }
    
    int main()
    {
        int var = 0;
        
        int size = sizeof(var++); //该行在编译期被替换为int size =4;
                                  //所以运行时,不存在var++之类的代码了
        
        printf("var = %d, size = %d
    ", var, size);
        
        size = sizeof(f()); //该行在编译期被替换为size = sizeof(函数的返回值类型) =4;
                            //即最终代码没有f()函数的调用,也就不会输出f()里面的printf
        
        printf("size = %d
    ", size);
        
        return 0;
    }

    3. typedef的意义

    (1)typedef用于给一个己经存在的数据类型重命名

    (2)typedef本质上不能产生新的类型

    (3)typedef重命名的类型

      ①可以在typedef语句之后定义

      ②不能被unsigned和signed修饰(即不能再定义为无符号或有符号)

         用法:typedef type new_name;

    【实例分析】typedef使用示例

    #include <stdio.h>
    
    typedef int Int32;
    
    //先定义类型后重命名类型
    struct _tag_point
    {
        int x;
        int y;
    };
    typedef struct _tag_point Point;
    
    //定义一个未命名类型,并用typedef重命名
    typedef struct
    {
        int length;
        int array[];
    } SoftArray; 
    
    
    //先重命名,再定义类型——看似不合法、别扭,但实际上正确的
    //可理解为,typedef并不给进行类型检查,只是简单去给一种类型起个别名,
    //如,本例本struct _tag_list_node重命名为ListNode,以后编译过程中遇到
    //ListNode,就用其实际的类型为struct _tag_List_Node来替换.
    typedef struct _tag_list_node ListNode; //先重命名
    struct _tag_list_node                   //再定义类型
    {
        ListNode* next;
    };
    
    int main()
    {
        Int32 i = -100;        // int 
        unsigned Int32 ii = 0; //error,不能为重命名类型指定义为signed或unsigned
        Point p;               // struct _tag_point
        SoftArray* sa = NULL;   
        ListNode* node = NULL; // struct _tag_list_node*
        
        return 0;
    }

    4. 小结

    (1)enum用于定义离散值类型

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

    (3)sizeof是编译器的内置指示符

    (4)sizeof不参与程序的执行过程

    (5)typedef用于给类型重命名:重命名的类型可以在typedef语句之后定义

  • 相关阅读:
    大话设计模式读书笔记--4.代理模式
    大话设计模式读书笔记--3.装饰模式
    大话设计模式读书笔记--2.策略模式
    大话设计模式读书笔记--1.简单工厂模式
    redis分片
    redis主从同步
    用Jedis连接Redis
    redis的数据类型和指令
    使用可视化工具redisclient连接redis
    《深入浅出通信原理》参考资料
  • 原文地址:https://www.cnblogs.com/5iedu/p/5320735.html
Copyright © 2020-2023  润新知