函数指针是指向函数的指针变量,它存储的是函数的入口地址。在C++中,函数指针允许我们将函数作为参数传递、存储在数据结构中或从其他函数返回。
// 声明一个函数指针
return_type (*pointer_name)(parameter_types);
// 示例
int (*funcPtr)(int, int); // 指向接受两个int参数并返回int的函数的指针
原因:函数签名与指针声明不匹配
int add(int a, int b) { return a + b; }
float (*funcPtr)(int, int) = add; // 错误:返回类型不匹配
解决方案:确保函数指针类型与函数签名完全一致
int (*funcPtr)(int, int) = add; // 正确
原因:未初始化的函数指针被调用
int (*funcPtr)(int, int);
funcPtr(1, 2); // 未定义行为
解决方案:始终检查指针是否为空
if (funcPtr) {
funcPtr(1, 2);
}
原因:成员函数指针需要对象实例才能调用
class MyClass {
public:
int method(int x) { return x * 2; }
};
int (MyClass::*memFuncPtr)(int) = &MyClass::method;
// memFuncPtr(5); // 错误:需要对象实例
解决方案:通过对象实例调用
MyClass obj;
(obj.*memFuncPtr)(5); // 正确
#include <functional>
std::function<int(int, int)> func = add;
auto lambda = [](int a, int b) { return a + b; };
struct Adder {
int operator()(int a, int b) { return a + b; }
};
Adder adder;
adder(3, 4);
#include <iostream>
#include <vector>
#include <algorithm>
// 普通函数
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
// 使用函数指针作为参数
void calculate(int a, int b, int (*operation)(int, int)) {
std::cout << "Result: " << operation(a, b) << std::endl;
}
// 回调函数示例
void processArray(int* arr, int size, int (*process)(int)) {
for (int i = 0; i < size; ++i) {
arr[i] = process(arr[i]);
}
}
int square(int x) { return x * x; }
int main() {
// 基本函数指针使用
int (*funcPtr)(int, int) = add;
std::cout << "3 + 5 = " << funcPtr(3, 5) << std::endl;
funcPtr = subtract;
std::cout << "7 - 2 = " << funcPtr(7, 2) << std::endl;
// 作为参数传递
calculate(10, 5, add);
calculate(10, 5, subtract);
// 回调示例
int arr[] = {1, 2, 3, 4, 5};
processArray(arr, 5, square);
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
// 用于标准算法
std::vector<int> vec = {5, 3, 1, 4, 2};
bool (*compare)(int, int) = [](int a, int b) { return a > b; };
std::sort(vec.begin(), vec.end(), compare);
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
函数指针是C/C++中强大的特性,虽然现代C++提供了更安全的替代方案,但理解函数指针对于维护旧代码和理解底层机制仍然非常重要。
没有搜到相关的文章