Menu
CoddyTech

调用函数指针

本课属于 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 中多态的基础。

challenge icon

挑战

简单

让我们练习通过指针调用函数,并切换要执行的函数。你将构建一个简单的计算器,它可以在运行时切换加法和减法。

编写一个程序,完成以下操作:

  1. 定义两个函数:
    • add:接受两个 int 参数,并返回它们的和
    • subtract:接受两个 int 参数,并返回第一个数减去第二个数的结果
  2. 在 main 中,声明一个名为 calc 的函数指针,它可以指向接受两个 int 参数并返回 int 的函数
  3. 读取 4 个输入:两个整数和两个运算代码
  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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器