函数指针是c++中指向函数地址的变量,用于传递、存储和调用函数。其声明需匹配目标函数的返回类型和参数列表,如int (funcPtr)(int, int)可指向int add(int, int)函数,并通过funcPtr(2, 3)调用。函数指针广泛用于回调机制,例如doOperation(int x, int y, int (operation)(int, int))能接收不同操作函数实现定制行为。尽管Lambda和std::function在现代C++中更灵活,但函数指针因性能优势和C兼容性仍在排序(如qsort)、事件处理等场景中使用。为简化语法,可用using MathFunc = int (*)(int, int);定义别名。掌握函数指针有助于理解底层调用机制和维护传统代码。

函数指针是C++中一个强大而灵活的特性,它允许我们将函数作为参数传递、存储在变量中,甚至作为返回值使用。这种能力在实现回调机制、事件处理和算法定制时非常有用。
什么是函数指针
函数指针是指向函数的指针变量,它保存的是函数的入口地址。通过函数指针,我们可以像调用普通函数一样调用它所指向的函数。
函数指针的声明需要与目标函数的返回类型和参数列表完全匹配。
示例:
立即学习“C++免费学习笔记(深入)”;
假设有一个简单的加法函数:
int add(int a, int b) { return a + b; }
对应的函数指针可以这样声明:
int (*funcPtr)(int, int);
然后将函数名赋值给该指针(函数名本身会退化为指针):
funcPtr = add;
调用方式有两种:
- (*funcPtr)(2, 3)
- funcPtr(2, 3) — 更常用,C++自动解引用
函数指针作为回调函数参数
回调函数是一种常见的设计模式,常用于异步操作、排序定制等场景。函数指针是实现回调的基础。
例如,写一个通用的doOperation函数,接受两个整数和一个操作函数指针:
int doOperation(int x, int y, int (*operation)(int, int)) {
return operation(x, y);
}
使用时传入不同的函数:
- doOperation(5, 3, add); // 调用加法
- doOperation(5, 3, [](int a, int b) { return a – b; }); // 注意:lambda不能直接用于普通函数指针,除非是函数对象或std::function
简化声明:使用typedef或using
函数指针语法较复杂,可以用typedef或using简化。
旧式写法:
typedef int (*MathFunc)(int, int);
C++11推荐方式:
using MathFunc = int (*)(int, int);
之后就可以这样使用:
MathFunc func = add;
int result = func(4, 5);
实际应用场景:排序中的比较函数
标准库如qsort要求传入比较函数指针:
int compare(const void* a, const void* b) {
return (*(int*)a – *(int*)b);
}
调用:
qsort(arr, n, sizeof(int), compare);
现代C++更推荐使用std::sort配合lambda,但理解函数指针有助于阅读老代码。
基本上就这些。掌握函数指针的关键是理解其声明格式,并多练习回调传参的用法。虽然现代C++倾向于使用std::function和lambda,但在性能敏感或与C兼容的场景中,函数指针依然不可替代。