1 enum 枚举类型的使用方法

  • enum是C语言中的一种自定义类型
  • enum是可以根据需要自定义的整形值
  • 第一个自定义的enum值默认为0
  • 默认情况下,enum值是在前一个定义值的基础上加1
  • enum类型的变量只能取定义时的离散值,如:

  • 上面的代码打印结果是0。所以说enum的变量大小是enum这个结构里面存的值的某一个。如上。

注意:enum中的各个变量之间是逗号隔开的。

1.1 enum枚举类型的特殊意义

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

具体如何定义常量,使用无名枚举,如下图所示:

  • 使用上述无名枚举,可以定义真正意义上的常量。所以上述定义数组时可以直接用ARRAY_SIZE作为数组的大小。

1.2 代码分析:enum的使用

  • 代码11-1-lyy.c:
#include <stdio.h>

enum {
    ARRAY_SIZE = 5
};

enum Color {
    RED   = 0x00FF0000,
    GREEN = 0x0000FF00,
    BLUE  = 0x000000FF,
};

void PrintColor(enum Color c){
    switch(c){
        case RED:
            printf("Color : (0x%08x)\n", c);
            break;
        case GREEN:
            printf("Color : (0x%08x)\n", c);
            break;
        case BLUE:
            printf("Color : (0x%08x)\n", c);
            break;
        default:
            printf("Error!\n");
            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("array[%d] = %d\n", i,array[i]);
    }
}
int main(){
    enum Color c = BLUE;
    
    PrintColor(c);
    
    int array[ARRAY_SIZE] = {0};
    
    InitArray(array);
    PrintArray(array);    
    return 0;
}
  • 上述代码编译运行结果为(gcc 4.4.5编译器):

可以看出,无名enum确实可以定义真正的常量。且使用enum类型,可以定义一组离散数据,该enum变量是这一组离散数据中的一个

2 sizeof 关键字的用法

注意;sizeof是C语言中的关键字,并不是函数。就像new/delete是C++的关键字而非函数一样

  • sizeof是C元编译器的内置指示符
  • sizeof用于计算 类型 或者 变量 所占用内存的大小
  • sizeof 的值在编译期就已经确定大小。之前学过的const也是在编译期间有效,运行期间无效。后面还有解释
  • sizeof 用于类型时是这样表述的:sizeof(type);
  • sizeof 用于变量时可以有两种表述方法:sizeof(var) ; 或者 sizeof var ;

如下图:

注意:

  • sizeof 在编译期间,将被具体的数值替换,程序执行过程中与sizeof没有任何关系
  • 比如下面的代码,执行后打印什么?

上述代码执行后,var的值依然是0 。因为sizeof在编译期间就确定了具体的数值。而var++ 是需要在程序运行时计算的,所以实际上var++ 在程序运行期间就没有被执行,因为在编译期间sizeof(var++)已经确定了值为4.

2.1 代码案例分析:sizeof的本质

  • 代码:11-2-lyy.c
#include <stdio.h>

int f(){
    printf("Lyy_Leran_C\n");
    return 0;
}
int main(){
    
    int var = 0;
    
    int size = sizeof(var++);
    printf("size = %d, var = %d\n",size,var);
    
    size = sizeof(f());
    //这之间并不打印 "Lyy_Leran_C"
    printf("size = %d\n",size);
    return 0;
}
  • 上述代码编译运行结果为:

可以看出,上述代码中,var变量的值依然是0,没有变化,而且并没有打印出字符串“Lyy_Leran_C” ,说明函数f() 也并没有被执行。
以上充分说明了,sizeof在编译期间就已经确定了值的大小。运行期间就与sizeof没有任何关系了

3 typedef的意义

有一种说法是错误的:typedef 是用于定义一种新的的类型。。。。。

注意,typedef不是用来定义新类型的,而是给已经存在的数据类型取一个别名(或者叫重命名)!!!

  • typedef用于给一个已经存在的数据类型重命名
  • typedef 本质上是不能产生新类型的
  • typedef 不能被 unsigned 或者signed 修饰 。这在下面的代码案例中可以看到
  • typedef 的用法:typedef type new_name ;
  • 可以在typedef 语句之后定义类型 。后面的代码示例会解释这句话的含义

3.1 代码案例:typedef 的使用案例

  • 代码:11-3-lyy.c
#include <stdio.h>

typedef int Int32;

struct _tag_point{
    int x;
    int y;
};

typedef struct _tag_point Point;

typedef struct {
    int len;
    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; //error
    Point p;      //struct _tag_point;
    
    SoftArray* sa = NULL; 
    ListNode* node = NULL;   //struct _tag_list_node*
    return 0;
}
  • 上述代码中的第25行如果不注释掉的话,程序编译错误。这就是之前提到过的typedef 不能被 unsigned 或者signed 修饰
  • 将25行注释掉后,程序编译通过。没有具体输出,知道如何使用即可
  • 并且上述代码中第17行使用的struct _tag_list_node 类型是在后面定义的。 这是允许的

4 总结

  • enum 用于定义离散值类型
  • 无名enum 定义的值是真正的常量
  • sizeof 是编译器内置的指示符
  • sizeof 不参与程序的执行过程
  • typedef 用于给已经存在的类型重命名
  • 重命名的类型可以在typedef 语句之后定义