在C语言的指针章节中,我们讲到函数指针模块
在函数指针中,有一个重要的关键字:typedef
typedef关键字
- 作用
- 基本语法
- 重难点:对数组指针与函数指针的重命名
- 数组指针重命名
- 一维数组指针重命名
- 遍历二维数组
- 函数指针重命名
作用
typedef是用来类型重命名的,将复杂的类型简单化
重要提示:
typedef
并不创建新的数据类型,它只是给现有的类型起了一个“外号”。编译器会把它和原始类型视为完全相同的类型。
基本语法
typedef existing_type new_type_name;
-
existing_type
:任何已有的基本数据类型(如int
,float
)或复合数据类型(如结构体、枚举、指针、数组)。 -
new_type_name
:你为这个类型定义的新的名称。
typedef unsigned int UINT;
typedef char BYTE;UINT count = 10; // 等价于 unsigned int count = 10;
BYTE letter = 'A'; // 等价于 char letter = 'A';
你的程序将来需要将
UINT
从unsigned int
改为unsigned long
,你只需要修改typedef
这一行代码即可,而不需要修改所有声明变量的地方。
重难点:对数组指针与函数指针的重命名
数组指针重命名
比如我们有数组指针类型
int(*)[5]
,需要重命名为parr_t
,那可以这样写:typedef int(*parr_t)[5]; //新的类型名必须在*的右边
一维数组指针重命名
#include <stdio.h>int main() {int arr[5] = {10, 20, 30, 40, 50};// 为"指向包含5个int的数组的指针"创建别名typedef int (*IntArray5Ptr)[5];// 使用该类型声明指针IntArray5Ptr ptr = &arr; // 注意:这里取整个数组的地址// 通过指针访问数组元素printf("第一个元素: %d\n", (*ptr)[0]);printf("第三个元素: %d\n", (*ptr)[2]);// 也可以这样访问printf("最后一个元素: %d\n", (*ptr)[4]);return 0;
}
遍历二维数组
#include <stdio.h>int main() {int matrix[2][3] = {{1, 2, 3},{4, 5, 6}};// 为"指向包含3个int的数组的指针"创建别名typedef int (*RowPtr)[3];// 使用该类型声明指针,指向第一行RowPtr ptr = matrix;printf("二维数组内容:\n");for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("%d ", (*ptr)[j]); // 访问当前行的元素}printf("\n");ptr++; // 移动到下一行}return 0;
}
函数指针重命名
基本语法:
typedef 返回类型 (*新类型名)(参数列表);
#include <stdio.h>// 定义一个函数指针类型
typedef int (*MathFunc)(int, int);// 实际函数
int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {// 使用类型别名声明函数指针MathFunc func = add;printf("加法结果: %d\n", func(5, 3));func = subtract;printf("减法结果: %d\n", func(5, 3));return 0;
}