声明函数指针
本课属于 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 中,这两种写法是等价的。
挑战
简单我们来练习声明函数指针并为它们赋值。你将创建一个简单的数学运算系统,让函数指针可以指向不同的算术函数。
编写一个程序,完成以下任务:
- 定义两个函数:
multiply:接收两个int参数,并返回它们的乘积subtract:接收两个int参数,并返回第一个数减去第二个数的结果
- 在
main中,声明一个名为operation的函数指针变量,它可以指向接收两个int参数并返回int的函数 - 读取 3 个输入:两个整数和一个运算代码(1 表示乘法,2 表示减法)
- 根据运算代码,将对应的函数赋给
operation指针 - 打印所赋值的运算名称,然后打印通过指针调用函数得到的结果
你将收到 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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器