调用函数指针
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 34 课,共 61 课。
现在你已经知道如何声明函数指针并为它赋值函数,下一步就是通过这个指针调用函数。
语法很简单。你使用函数指针的方式和调用普通函数一样:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // 调用 add(5, 3)
printf("%d\n", result); // 输出:8
return 0;
}只需写出指针名称,后面加上包含参数的括号。C 会自动解引用该指针,并执行它所指向的函数。
你也可以使用显式解引用语法 (*operation)(5, 3),但这不是必须的,而且不太常见。这两种形式会产生相同的结果。
当你将指针重新赋值为不同的函数时,真正的威力就显现出来了:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // 现在调用 subtract(5, 3)
printf("%d\n", result); // 输出:2同一个变量 operation 现在会执行完全不同的逻辑。这种在运行时切换行为的能力是 C 中多态的基础。
挑战
简单让我们练习通过指针调用函数,并切换要执行的函数。你将构建一个简单的计算器,它可以在运行时切换加法和减法。
编写一个程序,完成以下操作:
- 定义两个函数:
add:接受两个int参数,并返回它们的和subtract:接受两个int参数,并返回第一个数减去第二个数的结果
- 在
main中,声明一个名为calc的函数指针,它可以指向接受两个int参数并返回int的函数 - 读取 4 个输入:两个整数和两个运算代码
- 对于每个运算代码:
- 将相应的函数赋给
calc(1 表示add,2 表示subtract) - 通过指针调用函数,并传入这两个数
- 输出结果
- 将相应的函数赋给
你将收到 4 个输入:第一个数、第二个数、第一个运算代码(1 或 2)和第二个运算代码(1 或 2)。
输出应分两行显示两个结果,每个结果对应使用相同两个数执行的一次运算:
15
5在此示例中,输入为 10、5、1、2:第一个运算(代码 1)将 10 + 5 相加,结果为 15;随后重新赋值指针,第二个运算(代码 2)将 10 - 5 相减,结果为 5。
这展示了同一个指针变量如何通过在两次调用之间重新赋值,来执行完全不同的逻辑。
亲手试试
#include <stdio.h>
// TODO:在这里定义 add 函数
// TODO:在这里定义 subtract 函数
int main() {
// 读取输入
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO:声明一个名为 'calc' 的函数指针,使其指向
// 接收两个 int 参数并返回一个 int 值的函数
// TODO:对于第一个操作代码(op1):
// 将对应的函数赋给 calc(1 对应 add,2 对应 subtract)
// 通过指针调用函数并打印结果
// TODO:对于第二个操作代码(op2):
// 将对应的函数重新赋给 calc
// 通过指针调用函数并打印结果
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器