Menu
CoddyTech

声明函数指针

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 33 课,共 61 课。

到目前为止,我们已经学会了使用结构体嵌入来模拟继承。但真正的多态,也就是不同对象对同一个调用做出不同响应,还需要一种东西:函数指针。

函数指针是一种存储函数地址的变量。普通指针存储数据的地址,函数指针则存储可执行代码的地址。

一开始,这种语法可能看起来很复杂。要声明函数指针,你需要指定返回类型,然后在括号中写出带星号的指针名称,最后写出参数类型:

int (*operation)(int, int);

这声明了一个名为 operation 的变量,它可以指向任何一个接受两个 int 参数并返回 int 的函数。*operation 两侧的括号至关重要,没有它们,你声明的将是一个返回指针的函数。

要将函数赋给这个指针,只需使用函数名(不带括号):

int add(int a, int b) {
    return a + b;
}

int (*operation)(int, int);
operation = add;  // 现在 operation 指向 add。

函数名就像它的地址。你也可以显式使用 &add,但这不是必需的:在 C 中,这两种写法是等价的。

challenge icon

挑战

简单

我们来练习声明函数指针并为它们赋值。你将创建一个简单的数学运算系统,让函数指针可以指向不同的算术函数。

编写一个程序,完成以下任务:

  1. 定义两个函数:
    • multiply:接收两个 int 参数,并返回它们的乘积
    • subtract:接收两个 int 参数,并返回第一个数减去第二个数的结果
  2. 在 main 中,声明一个名为 operation 的函数指针变量,它可以指向接收两个 int 参数并返回 int 的函数
  3. 读取 3 个输入:两个整数和一个运算代码(1 表示乘法,2 表示减法)
  4. 根据运算代码,将对应的函数赋给 operation 指针
  5. 打印所赋值的运算名称,然后打印通过指针调用函数得到的结果

你将收到 3 个输入:第一个数字、第二个数字和运算代码(1 或 2)。

输出应如下所示:

Operation: multiply
Result: 35

其中,multiply 是运算名称(如果代码是 2,则为 subtract),35 是通过你的指针调用函数得到的结果(本例中为 5 × 7)。

记住:声明函数指针时,需要写返回类型、带星号且放在括号中的指针名称,以及参数类型。为函数指针赋值时,只需使用函数名,不要加括号。

亲手试试

#include <stdio.h>

// TODO: 在这里定义 multiply 函数


// TODO: 在这里定义 subtract 函数


int main() {
    int num1, num2, code;
    
    // 读取输入
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: 声明一个名为 'operation' 的函数指针,使其能够指向
    // 接收两个 int 参数并返回一个 int 的函数
    
    
    // TODO: 根据操作代码(1 表示 multiply,2 表示 subtract),
    // 将对应的函数赋给你的 operation 指针
    
    
    // TODO: 输出操作名称和结果
    // 格式:
    // 操作:<name>
    // 结果:<result>
    
    return 0;
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: C 在线编译器