一、什么是函数指针
函数指针,就是指向函数的指针,它存储着函数的地址。和普通指针一样,函数指针可以进行赋值、传递、调用等操作。
二、如何声明函数指针
函数指针的声明格式为:返回值类型 (*函数指针变量名)(参数列表)。
比如,下面是一个声明一个指向int类型函数的指针的例子:
int (*p)(int, int);
意思是声明了一个指向返回值为int类型,带两个int类型参数的函数的指针变量p。
三、C语言返回函数指针
C语言中,函数可以返回指针类型的值,同样的,函数也可以返回一个指向函数的指针。
函数返回指针变量的方法与普通变量的方法相同。只要在函数的返回类型前加上指向函数的指针符号(*)即可。
例如,下面是一个返回指向函数的指针的示例:
int (*func1(int a))(int, int){ // 返回类型为指向返回值为int,带两个int参数的函数的指针的函数
printf("This is func1\n");
int (*p)(int, int) = NULL;
if(a == 0)
p = sum;
else
p = minus;
return p;
}
上述代码中,func1是一个函数,它的返回值是一个指向返回值为int类型且带两个int类型参数的函数的指针。
当a为0时,func1返回sum函数的指针;否则返回minus函数的指针。
下面是sum和minus函数的声明:
int sum(int a, int b);
int minus(int a, int b);
sum和minus函数都是返回值为int类型且带两个int类型参数的函数。
四、函数指针的使用
函数指针可以用于回调函数中,也可以用于实现函数的动态调用。
1、回调函数
回调函数,是指由调用者指定的、在适当的条件下由被调函数调用的函数,是一种常见的编程方式。
下面是一个使用回调函数的示例:
void callback(int a, int b, int (*p)(int, int)){
int result = p(a, b);
printf("The result is %d\n", result);
}
int sum(int a, int b){
return a + b;
}
int main(){
callback(1, 2, sum);
return 0;
}
上述代码中,callback函数的第三个参数是一个指向返回值为int类型、带两个int类型参数的函数的指针。在callback函数中,使用该指针变量调用函数p,返回相应的结果。
在main函数中,调用callback函数,并传递sum函数的指针作为第三个参数。
程序输出结果为:The result is 3,即1和2的和。
2、动态调用函数
动态调用函数,是指在程序运行时根据需要来确定要调用的函数。
下面是一个动态调用函数的示例:
#include <stdio.h>
#include <stdlib.h>
int sum(int a, int b){
return a + b;
}
int minus(int a, int b){
return a - b;
}
int main(){
int a = 10, b = 5;
char op = '-';
int (*p)(int, int) = NULL;
if(op == '+')
p = sum;
else if(op == '-')
p = minus;
if(p != NULL)
printf("%d %c %d = %d\n", a, op, b, p(a, b));
return 0;
}
上述代码中,通过定义一个指向返回值为int类型、带两个int类型参数的函数的指针变量p,根据不同的op值来动态指定要调用的函数。
如果op为‘+’,就指定p为sum指针;如果op为‘-’,就指定p为minus指针。
最后通过调用p变量的方式来调用对应的函数,返回相应的结果。
程序输出结果为:10 – 5 = 5。