1、将函数作为参数传递
将函数作为参数传递给另一个函数,实际上就是将函数指针作为参数传递。这样,被调用的函数就可以根据传入的函数指针来调用不同的函数。
#include <stdio.h>
// 一个简单的函数,计算两个整数的和
int add(int a, int b) {
return a + b;
}
// 另一个函数,计算两个整数的差
int subtract(int a, int b) {
return a - b;
}
// 接受一个函数指针作为参数的函数
void operate(int a, int b, int (*operation)(int, int)) {
int result = operation(a, b); // 调用传入的函数
printf("Result: %d\n", result);
}
int main() {
int x = 5, y = 3;
// 将 add 函数作为参数传递给 operate
operate(x, y, add); // 输出 Result: 8
// 将 subtract 函数作为参数传递给 operate
operate(x, y, subtract); // 输出 Result: 2
return 0;
}
2、函数指针的声明和使用
函数指针是指向函数的指针变量。就像普通指针指向变量一样,函数指针指向函数。通过函数指针,我们可以间接调用函数,实现函数的动态绑定。
1)函数指针的声明
函数指针的声明格式如下,
return_type (*pointer_name)(parameter_types);
return_type
是函数返回值的类型
pointer_name
是指针的名称
parameter_types
是函数的参数类型
2)将函数指针作为参数传递给另一个函数
#include <stdio.h>
// 定义一个函数,返回int,接受两个int参数
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
// 定义一个函数,接受一个函数指针作为参数
// 该指针指向一个接受两个int参数并返回int的函数
int operate(int a, int b, int (*operation)(int, int)) {
return operation(a, b);
}
int main() {
int x = 10, y = 5;
// 将 add 函数作为参数传递给 operate 函数
printf("Add: %d\n", operate(x, y, add));
// 将 subtract 函数作为参数传递给 operate 函数
printf("Subtract: %d\n", operate(x, y, subtract));
return 0;
}
3、复杂的函数指针
可以让函数指针指向一个返回 void
的函数。
#include <stdio.h>
// 计算并输出两个数的和
void print_sum(int a, int b) {
printf("Sum: %d\n", a + b);
}
// 接受函数指针作为参数
void execute(void (*func)(int, int), int a, int b) {
func(a, b); // 调用传入的函数
}
int main() {
int x = 5, y = 3;
execute(print_sum, x, y); // 输出 Sum: 8
return 0;
}
4、返回函数指针
函数可以返回函数指针,可以通过这种方式返回一个指向函数的指针,并在其他地方使用它。
#include <stdio.h>
// 返回一个指向函数的指针
int (*get_operator(char op))(int, int) {
if (op == '+') {
return add;
} else if (op == '-') {
return subtract;
} else {
return NULL;
}
}
// 两个简单的运算函数
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main() {
int (*operation)(int, int);
operation = get_operator('+'); // 获取加法操作的函数指针
printf("Result: %d\n", operation(5, 3)); // 输出 8
operation = get_operator('-'); // 获取减法操作的函数指针
printf("Result: %d\n", operation(5, 3)); // 输出 2
return 0;
}