目录
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
- 问题:16 行输出
-
3 typedef 关键字
3.1 typedef 的意义
-
typedef
用于给一个已经存在的数据类型重命名 -
typedef
本质上不能产生新的类型 -
typedef
重命名的类型- 可以在
typedef
语句之后定义 - 新的命名不能被
unsigned
和signed
修饰
- 可以在
-
用法:
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; }