函数指针是存储函数入口地址的变量,用于通过指针调用函数;回调函数是作为参数传入并在适当时机被调用的普通函数,依赖函数指针实现。

什么是函数指针和回调函数
函数指针就是指向函数入口地址的变量,它能存储函数名(本质是地址),之后通过该指针调用函数。回调函数不是某种特殊函数,而是“被作为参数传给另一个函数,并在适当时候被调用”的普通函数——这个“传入并被调用”的机制,就靠函数指针来实现。
声明与定义函数指针类型
函数指针的声明要严格匹配目标函数的签名(返回类型、参数个数和类型)。例如:
int func(int a, double b); 的对应函数指针类型写法有多种:
- 直接声明:int (*pf)(int, double);
- 用 typedef 简化:typedef int (*FuncPtr)(int, double); FuncPtr pf;
- C++11 起推荐用 using:using FuncPtr = int(*)(int, double);
注意括号不能省: int *pf(int, double) 是函数声明(返回 int*),不是函数指针。
立即学习“C++免费学习笔记(深入)”;
把函数指针作为参数实现回调
这是最典型的回调场景:一个处理函数接受函数指针,在内部某个时机调用它。
比如写一个通用排序后遍历打印的工具:
void process_sorted(int arr[], int n, void (*callback)(int)) {
std::sort(arr, arr + n); // 先排序
for (int i = 0; i < n; ++i) {
callback(arr[i]); // 回调:对每个元素执行用户自定义操作
}
}使用时传入具体函数名(即地址):
- void print_square(int x) { std::cout
- process_sorted(data, 5, print_square);
进阶:带状态的回调(捕获上下文)
纯函数指针无法携带额外数据(如配置、对象实例)。常见解决方式有两种:
- 加 void* 参数:C 风格兼容方案。目标函数多一个 void* userdata 参数,调用方传入任意指针,回调里再 reinterpret_cast 回原类型
-
用 std::function + lambda(更现代 C++ 推荐):std::function
callback 可绑定 lambda、成员函数或普通函数,天然支持捕获局部变量
例如用 lambda 实现带偏移量的打印:
int offset = 10;
process_with_func(data, 5, [offset](int x) { std::cout << x + offset << " "; });这时函数参数类型需改为 std::function










