首页 > 编程笔记
C++函数指针(指向函数的指针)
在 C++ 中,函数也是有地址的。编译之后的函数,其实是一组指令的集合,这样一组指令在程序运行时存在于内存中,其起始地址就是该函数的地址,也称做函数的入口地址。
编写 C++ 程序时,可以用函数名来表示函数的地址,也可以在函数名之前加上取地址符号“&”表示函数的地址。
举个简单的例子:
我们知道,指针可以用于存储变量的地址,它还可以用于存储函数的地址,这样的指针就称为函数指针。
函数指针在 C++ 编程中有广泛的应用,比如回调函数、策略模式和表驱动方法。
可以在定义函数指针的同时为它赋初值,也可以在定义后再另行赋值。例如,令 functionPtr 指向上面的 add() 函数:
以下的 C++ 程序演示了如何使用函数指针。
selectFunction() 的返回类型稍微有些复杂,因为它自身返回一个函数指针。这里,
main() 函数中调用 selectFunction() 返回的函数指针来计算结果,实现了动态地根据某些条件(这里是一个字符操作符)来选择要执行的函数,这是使用函数指针作为返回值的一个常见应用场景。
编写 C++ 程序时,可以用函数名来表示函数的地址,也可以在函数名之前加上取地址符号“&”表示函数的地址。
举个简单的例子:
int add(int a, int b) { return a + b; }add() 函数的地址可以用函数名
add
或者&add
表示。我们知道,指针可以用于存储变量的地址,它还可以用于存储函数的地址,这样的指针就称为函数指针。
函数指针也是一个变量,可以指向不同的函数。同时通过函数指针可以调用其指向的函数,从而使得函数调用更加灵活。存储函数入口地址的指针,也可以说成是指向函数的指针,它们是等价的。
函数指针在 C++ 编程中有广泛的应用,比如回调函数、策略模式和表驱动方法。
函数指针的定义
定义一个函数指针,遵循以下格式:返回值类型 (*函数指针名)(参数列表);例如,定义一个指向返回值类型为 int、参数列表为 (int, int) 的函数指针:
int (*functionPtr)(int, int);其中,functionPtr 就是函数指针的名称。注意,函数指针名两侧的括号不能省略,否则就变成了一个返回 int* 类型的函数声明。
可以在定义函数指针的同时为它赋初值,也可以在定义后再另行赋值。例如,令 functionPtr 指向上面的 add() 函数:
functionPtr = &add或者更简洁地写成下面这种方式:
functionPtr = &add
函数指针的使用
使用函数指针调用函数同函数调用一样,只要在函数指针后面加上实参列表即可。以下的 C++ 程序演示了如何使用函数指针。
#include <iostream> // 两个简单的函数 int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } int main() { // 声明一个返回类型为int,接受两个int参数的函数指针 int (*functionPtr)(int, int); // 初始化函数指针 functionPtr = add; // 使用函数指针调用函数 int sum = functionPtr(2, 3); // 输出应为5 std::cout << "Sum: " << sum << std::endl; // 改变函数指针指向 functionPtr = multiply; // 再次使用函数指针调用函数 int product = functionPtr(2, 3); // 输出应为6 std::cout << "Product: " << product << std::endl; return 0; }运行结果为:
Sum: 5
Product: 6
函数指针作为参数
函数指针也可以作为其它函数的参数,例如:#include <iostream> // 定义两个简单的函数 int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } // 定义一个函数,它接受一个函数指针作为参数 void execute(int (*funcPtr)(int, int)) { int result = funcPtr(2, 3); std::cout << "Result: " << result << std::endl; } int main() { // 使用add函数作为参数调用execute std::cout << "Executing 'add' function:" << std::endl; execute(add); // 使用multiply函数作为参数调用execute std::cout << "Executing 'multiply' function:" << std::endl; execute(multiply); return 0; }输出结果为:
Executing 'add' function:
Result: 5
Executing 'multiply' function:
Result: 6
函数指针作为返回值
函数指针也可以作为其它函数的返回值。例如:#include <iostream> // 两个简单的函数 int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } // 一个函数,根据输入参数返回对应的函数指针 int (*selectFunction(char op))(int, int) { if (op == '+') { return add; } if (op == '*') { return multiply; } // 返回nullptr表示无效的操作符 return nullptr; } int main() { // 根据输入参数获取函数指针 int (*funcPtr)(int, int) = selectFunction('+'); // 使用函数指针 if (funcPtr != nullptr) { int result = funcPtr(3, 4); // 输出应为 7 std::cout << "Result: " << result << std::endl; } else { std::cout << "Invalid operator." << std::endl; } // 再次获取函数指针,这次使用乘法 funcPtr = selectFunction('*'); // 再次使用函数指针 if (funcPtr != nullptr) { int result = funcPtr(3, 4); // 输出应为 12 std::cout << "Result: " << result << std::endl; } else { std::cout << "Invalid operator." << std::endl; } return 0; }执行结果为:
Result: 7
Result: 12
selectFunction() 的返回类型稍微有些复杂,因为它自身返回一个函数指针。这里,
int (*selectFunction(char op))(int, int)
的意义是:selectFunction 是接受一个 char 参数、返回值类型为 int (*)(int, int)
的函数。main() 函数中调用 selectFunction() 返回的函数指针来计算结果,实现了动态地根据某些条件(这里是一个字符操作符)来选择要执行的函数,这是使用函数指针作为返回值的一个常见应用场景。