zoukankan      html  css  js  c++  java
  • 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;
      }
      
  • 相关阅读:
    红黑树的修正过程
    配置文件elasticsearch.yml详解
    HEAD插件安装
    css reset.css
    vue-router之router-link
    vue2.0 代码功能片段
    vue2.0的常用功能简介
    electron 的中文文档的地址 以及 窗口改变的步骤
    ph 的使用步骤
    git 提交的步骤
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13598991.html
Copyright © 2011-2022 走看看