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 语句之后定义