- 函数指针的概念
- 函数指针是指向函数的指针变量。在 C++ 中,函数本身不是变量,但是可以定义一个指针变量,让它指向一个函数。这样就可以通过这个指针变量来调用它所指向的函数。函数指针的类型由它所指向的函数的返回类型和参数类型决定。
- 例如,有一个函数
int add(int a, int b)
,它的函数指针类型应该是int (*)(int, int)
,这个类型表示一个指向返回值为int
,参数是两个int
类型的函数的指针。
- 函数指针的定义
- 一般形式为:
返回类型 (*指针变量名)(参数列表);
。 - 例如:
int (*funcPtr)(int, int);
- 这里定义了一个名为
funcPtr
的函数指针,它可以指向一个返回类型为int
,有两个int
类型参数的函数。
- 函数指针的赋值
- 函数指针在使用之前必须先赋值,让它指向一个具体的函数。赋值的方式是将函数名(不带括号和参数)赋给函数指针。
- 假设已经有函数
int add(int a, int b)
和int subtract(int a, int b)
,可以这样赋值:
int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int (*funcPtr)(int, int); funcPtr = add; // 将函数add的地址赋给funcPtr
- 注意,函数名在表达式中使用时,会自动转换为函数的入口地址,也就是函数指针的值。
- 函数指针的调用
- 可以通过函数指针来调用它所指向的函数。调用方式有两种:
- 第一种是使用
(*指针变量名)(参数列表)
的形式。例如:
int result = (*funcPtr)(3, 5); // 调用funcPtr指向的函数,这里是add函数,结果为8
- 第二种是直接使用
指针变量名(参数列表)
的形式。在 C++ 中这种形式更为常用,例如:
funcPtr = subtract; int newResult = funcPtr(7, 4); // 调用subtract函数,结果为3
- 函数指针作为函数参数
- 函数指针的一个重要用途是作为函数的参数。这使得一个函数可以接收另一个函数作为参数,从而增加了函数的灵活性。
- 例如,定义一个函数
void calculate(int a, int b, int (*operation)(int, int))
,它接受两个整数a
和b
,以及一个函数指针operation
,这个函数指针指向一个可以对两个整数进行操作的函数。
void calculate(int a, int b, int (*operation)(int, int)) { int result = operation(a, b); std::cout << "The result is: " << result << std::endl; } int main() { calculate(2, 3, add); calculate(5, 1, subtract); return 0; }
- 在
main
函数中,calculate
函数分别被调用两次,第一次传入add
函数,第二次传入subtract
函数,这样就可以根据传入的不同函数来执行不同的计算。
- 函数指针数组
- 可以定义一个数组,数组的元素是函数指针。例如,定义一个函数指针数组来存储指向不同算术运算函数的指针:
int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int multiply(int a, int b) { return a * b; } int divide(int a, int b) { return a / b; } int (*funcArray[])(int, int) = {add, subtract, multiply, divide};
- 可以通过索引来访问数组中的函数指针并调用相应的函数,例如:
int result1 = funcArray[0](4, 2); // 调用add函数,结果为6 int result2 = funcArray[2](3, 5); // 调用multiply函数,结果为15