8 enum,sizeof 和 typedef

1 enum 关键字

1.1 枚举类型的使用方法

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

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

  • 第一个定义的 enum 值默认为 0 ;默认情况下的 enum 值是在前一个定义值的基础上加 1

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

  • 示例

    enum Color
    {
      GREEN,
      RED = 2,
      BLUE
    };
    
    enum Color c = GREEN;
    printf("c = %d
    ",c);  // 0
    

1.2 枚举类型的特殊意义

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

  • enum 多用于定义整型常量

  • 示例

    enum  // 无名枚举,用于定义常量
    {
        ARRAY_SIZE = 10  //定义数组大小
    };
    
    int array[ARRAY_SIZE] = {0};
    int i = 0;
    
    for(i = 0; i < ARRAY_SIZE; i++){
        array[i] = i + 1;
    }
    
  • 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)
    ", 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;
        
        int array[ARRAY_SIZE] = {0};
        
        PrintColor(c);
        
        InitArray(array);
        
        PrintArray(array);
        
        return 0;
    }
    
    //输出结果
    Color: GREEN (0x0000FF00)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10   
    

2 sizeof 关键字

2.1 sizeof 关键字的用法

  • sizeof 是编译器的内置指示符

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

  • sizeof 的值在编译期就已经确定

  • sizeof 用于类型:sizeof(type)

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

  • 示例

    int var = 0;
    
    printf("%d
    ",sizeof(int));  // 4
    printf("%d
    ",sizeof(var));  // 4
    printf("$d
    ",sizeof var);   // 4
    

2.2 sizeof 误区

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

    • 在编译过程中所有的 sizeof 将被具体的数值所替换
    • 程序的执行过程与 sizeof 没有任何关系,即 sizeof 不参与程序的执行过程
  • 示例

    • Demo

      #include <stdio.h>
      
      int f()
      {
          printf("ABCD
      ");
          
          return 0;
      }
      
      int main()
      {
          int var = 0;
          
          int size = sizeof(var++);
          
          printf("var = %d, size = %d
      ", var, size);  // var = 0,size = 4
          
          size = sizeof(f());
          
          printf("size = %d
      ", size);  // size = 4
          
          return 0;
      }
      
    • 编译运行

      • 问题:16 行输出 var = 0 ,为什么自增 1 没有体现?;18行没有调用打印字符串 ABCD 的代码?
      • 分析:编译器在编译的时候 sizeof 将会被具体的数值替换:14 行代码为:int size = 4; 18 行代码为:size = 4
      var = 0,size = 4
      size = 4
      

3 typedef 关键字

3.1 typedef 的意义

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

  • typedef 本质上不能产生新的类型

  • typedef 重命名的类型

    • 可以在 typedef 语句之后定义
    • 新的命名不能被 unsignedsigned 修饰
  • 用法:typedef type new_name;

  • 示例

    #include <stdio.h>
    
    typedef int Int32;
    
    //(1)先定义struct类型:_tag_point
    struct _tag_point
    {
        int x;
        int y;
    };
    //再给_tag_point重命名:Point => struct _tag_point
    typedef struct _tag_point Point;
    
    
    //(2)在typedef语句中同时定义一个struct类型,并且将其重命名为SoftArray
    typedef struct
    {
        int length;
        int array[];
    } SoftArray; 
    
    //(3)先重命名一个类型,再定义该类型:struct _atg_list_node => ListNode
    typedef struct _tag_list_node ListNode;
    //定义该类型
    struct _tag_list_node
    {
        ListNode* next;  //等价于:struct _tag_list_node* 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;
    }
    
原文地址:https://www.cnblogs.com/bky-hbq/p/13598991.html