概述:是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。用法:
cc折叠展开
typedef int elemtype;此时 elemtype 等价于 int,即可用 elemtype a; 语句定义一个 int 类型的数据。
重点在于与结构体结合使用,例如:
cc折叠展开
typedef struct tagMyStruct{ int iNum; long lLength;} MyStruct;这语句实际上完成两个操作:
- 定义一个新的结构类型
cc折叠展开
struct tagMyStruct{ int iNum; long lLength;};分析:tagMyStruct 称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和 tagMyStruct 一起,构成了这个结构类型,不论是否有 typedef,这个结构都存在。
我们可以用 struct tagMyStruct varName 来定义变量,但要注意,使用 tagMyStruct varName 来定义变量是不对的,因为 struct 和 tagMyStruct 合在一起才能表示一个结构类型。
typedef为这个新的结构起了一个名字,叫MyStruct:
cc折叠展开
typedef struct tagMyStruct MyStruct;因此,MyStruct 实际上相当于 struct tagMyStruct,我们可以使用 MyStruct varName 来定义变量。
当然,MyStruct 可以命名为 tagMyStruct 一样,例如 Redis 中的用法:
cc折叠展开
typedef struct aeApiState { int kqfd; struct kevent *events; char *eventsMask;} aeApiState;aeApiData 既是结构体标签,也是 typedef 之后的类型名。
同样 typedef 也可以应用于函数指针和二级指针(指针的指针),如:
cc折叠展开
typedef void (*FuncPtr)(int); // 定义函数指针类型 void printNumber(int n) { printf("Number: %d\\n", n);} int main() { FuncPtr func = printNumber; // 等价于 void (*func)(int) = printNumber; func(100); return 0;}cc折叠展开
typedef char** CharPtrPtr; // 定义二级指针类型 int main() { char *str = "Hello"; CharPtrPtr pptr = &str; // 等价于 char** pptr = &str; printf("%s\\n", *pptr); return 0;}| 方式 | typedef 形式 | 等价写法 |
|---|---|---|
| 指针别名 | typedef int* IntPtr; | int *p; |
| 结构体指针 | typedef Point* PointPtr; | Point *p; |
| 函数指针 | typedef void (*FuncPtr)(int); | void (*func)(int); |
| 二级指针 | typedef char** CharPtrPtr; | char **p; |
| 链表指针 | typedef Node* NodePtr; | Node *p; |
使用 typedef 定义指针类型,可以让代码更易读,减少复杂指针声明带来的混淆。


