概述:是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。用法:
typedef int elemtype;
此时 elemtype
等价于 int
,即可用 elemtype a;
语句定义一个 int
类型的数据。
重点在于与结构体结合使用,例如:
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这语句实际上完成两个操作:
- 定义一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct
称为“tag”,即“标签”,实际上是一个临时名字,struct
关键字和 tagMyStruct
一起,构成了这个结构类型,不论是否有 typedef
,这个结构都存在。
我们可以用 struct tagMyStruct varName
来定义变量,但要注意,使用 tagMyStruct varName
来定义变量是不对的,因为 struct
和 tagMyStruct
合在一起才能表示一个结构类型。
typedef
为这个新的结构起了一个名字,叫MyStruct
:
typedef struct tagMyStruct MyStruct;
因此,MyStruct
实际上相当于 struct tagMyStruct
,我们可以使用 MyStruct varName
来定义变量。
当然,MyStruct 可以命名为 tagMyStruct 一样,例如 Redis 中的用法:
typedef struct aeApiState {
int kqfd;
struct kevent *events;
char *eventsMask;
} aeApiState;
aeApiData
既是结构体标签,也是 typedef
之后的类型名。
同样 typedef
也可以应用于函数指针和二级指针(指针的指针),如:
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;
}
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 定义指针类型,可以让代码更易读,减少复杂指针声明带来的混淆。 |