0、前言
在 C 语言中,函数指针是指向函数的变量,它可以存储函数的地址并在运行时调用函数。函数指针为 C 语言提供了极大的灵活性,是实现回调函数、动态调用和多态的关键机制。
1、函数指针基础知识
1.1、函数指针的声明和初始化
// 声明语法:返回类型 (*指针名)(参数列表)
int (*add)(int, int); // 声明一个指向返回int、接受两个int参数的函数指针
int* add(int,int); /* 声明一个指向返回int*、接受两个int参数的函数 */
// 初始化(指向具体函数)
int sum(int a, int b) { return a + b; }
add = sum; // 或 add = ∑(&可选)
1.2、通过函数指针调用函数
int result = (*add)(3, 4); // 显式解引用调用
// 或简化为(C语言支持直接通过指针调用)
int result = add(3, 4); // 隐式解引用调用
1.3、函数指针作为回调函数
void apply(int (*func)(int), int x) {
printf("Result: %d\n", func(x)); // 调用传入的函数
}
int square(int n) { return n * n; }
// 调用示例
apply(square, 5); // 输出25
1.4、函数指针数组
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int (*operations[2])(int, int) = {add, sub}; // 函数指针数组
// 调用示例
int result = operations[0](5, 3); // 调用add(5,3)
2、函数指针的常见应用场景
2.1、回调函数(Callback)
将函数作为参数传递,由其他函数在特定时机调用。
// 标准库qsort函数的原型
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
// 自定义比较函数
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
// 使用回调
qsort(array, 10, sizeof(int), compare);
2.2、实现状态机
根据不同状态实现不同的操作。
void state_init(void);
void state_run(void);
void state_shutdown(void);
void (*state_handlers[])(void) = {state_init, state_run, state_shutdown};
// 根据状态调用对应函数
state_handlers[current_state]();
2.3、动态函数调用
根据用户输入或运行时条件选择调用函数。
int (*math_func)(int, int);
if (operation == '+') {
math_func = add;
} else if (operation == '-') {
math_func = sub;
}
int result = math_func(10, 5); // 动态调用
2.4、接口封装(模拟多态)
不同模块实现相同接口,通过函数指针调用。
typedef struct {
void (*init)(void);
void (*process)(int data);
} DeviceInterface;
void deviceA_init(void);
void deviceA_process(int data);
DeviceInterface deviceA = {deviceA_init, deviceA_process};
// 使用接口调用函数
deviceA.init();
deviceA.process(42);