1 枚举类型的使用方法
- enum 是 C 语言中的一种自定义类型
- enum 值是可以根据需要自定义的整数值
- 默认情况下第一个定义的 enum 值为 0,其他的值是在前一个值的基础上加 1
- enum 类型的变量只能取定义时的离散值
枚举类型的特殊意义:
enum 中定义的值是 C 语言中真正意义上的常量,在工程中 enum 多用于定义整型常量,其值不能再修改。
下面通过一个例子来说明 enum 的使用
//11-1.c
#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 (Ox%08X)\n", c);
break;
case GREEN:
printf("Color: GREAN (0x%08X)\n", c);
break;
case BLUE:
printf("Color: BLUE(0x%08X)\n", c);
break;
default:
printf("Unknow color\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("%d\n", array[i]);
}
}
int main(){
enum Color c = GREEN;
int array[ARRAY_SIZE] = {0};
PrintColor(c);
InitArray(array);
PrintArray(array);
return 0;
}
2 sizeof 关键字
2.1 sizeof 关键字的用法
sizeof 是编译器的内置指示符,用于计算类型或者变量的所占的内存大小,sizeof 的值在编译器就已经确定了。
语法如下:
以前使用 sizeof,感觉就像一个函数一样,其实 sizeof 并不是函数,而是编译器的内置指示符,从 sizeof var 的用法也可以看出来,函数不能这么使用
2.2 为 sizeof 正名
- sizeof 是 C 语言的内置关键字而不是函数
- 在编译过程中所有的 sizeof 将被具体的数值替换,函数的执行过程与 sizeof 没有任何关系
下面通过一个例子来说明。
//11-2.c
#include<stdio.h>
int f(){
printf("hello world!");
return 0;
}
int main(){
int var = 0;
int size = sizeof(var++);
printf("var = %d, size = %d\n", var, size);
size = sizeof(f());
printf("size = %d\n", size);
return 0;
}
1、var 为 int 型的变量,所以大小为 4,为什么打印的 var 的值为 0 呢?在编译期,sizeof(var++) 已经被替换成了 4,var++根本没有执行,所以 var 的值还是 4。
2、f() 返回值为 int,所以 sizeof(f()) 为 4,为什么没有打印出 hello world! 呢, 还是因为 sizeof 是在编译过程将用数值替换,函数的执行过程与 sizeof 没有任何关系,所以 f() 函数不会执行。
3 typedef 的意义
想象一个场景:假设你在面试,考官:你能说说 typedef 的具体意义吗?
下面就来说说 typedef 的意义
- typedef 用于给一个已经存在的数据类型重命名
- typedef 本质上不能产生新的类型
- typedef 重命名的类型可以在 typedef 语句之后定义,且不能被 unsigned 和 signed 修饰
用法:typedef type new_name;
type 是已经有的数据类型,new_name 是该数据类型的别名
//11-3.c
#include<stdio.h>
typedef int Int32;
struct _tag_point{
int x;
int y;
};
typedef struct _tag_point Point;
typedef struct {
int length;
int array[];
}SoftArray;
typedef struct _tag_list_node ListNode;
struct _tag_list_node{ // ypedef 重命名的类型可以在 typedef 语句之后定义
ListNode* next;
};
int main(){
Int32 i = -100;
//unsigned Int32 ii = 0; // typedef 重命名的类型不能被 unsigned 和 signed 修饰
Point p;
SoftArray* sa = NULL;
ListNode* node = NULL;
return 0;
}
4 小结
1、enum 用于定义离散值类型,enum 定义的值是真正意义上的常量
2、sizeof 是编译器的内置指示符,不参与程序的执行过程
3、typedef 用于给类型重命名,重命名的类型可以在 typedef 语句之后定义