c语言的函数指针与回调函数
c语言的函数指针与回调函数
函数指针
定义了一个函数类型的指针变量。
通常我们说的指针变量是指一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以想一般函数一样,用于调用函数、传递参数。
函数指针类型的声明:
typedef int (*fun_ptr)(int,int);//声明一个指向同样参数、返回值的函数指针类型
实例:
声明指针p,指向函数max
#include <stdio.h>
int max(int x, int y)
{
return x>y?x:y;
}
int main()
{
int (*p)(int,int) = &max;//&可以省略
int a,b,c,d;
printf("请输入三个数字:\n");
scanf("%d %d %d",&a,&b,&c);
d = p(p(a,b),c);
printf("最大的数字是:%d\n",d);
return 0;
}
编译执行结果为:
请输入三个数字:
1 2 3
最大的数字是:3
回调函数
函数指针可以作为某个函数的参数来使用,回调函数就是一个通过函数指针调用的函数。
回调函数是由别人的函数执行时调用你实现的函数。
实例:
实例中定义populate_array()函数,定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。
实例中我们定义额回调函数getNextRandomValue(),它返回一个随机值,它作为函数指针传递给populate_array()函数。
populate_array()将调用10次的回调函数,并将回调函数的返回值赋值给数组。
#include <stdio.h>
#include <stdlib.h>
void populate_array(int *array,size_t arraySize,int (*getNextValue)())
{
for(size_t i = 0; i < arraySize; i++){
array[i] = getNextValue();
}
}
int getNextRandomValue()
{
return rand();
}
int main()
{
int myArray[10];
/* getNextRandomValue 不能加括号,否则无法编译,
因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/
populate_array(myArray, 10, getNextRandomValue);
for(size_t i = 0; i < 10; i++){
printf("%d ", myArray[i]);
}
return 0;
}
编译执行结果:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464

浙公网安备 33010602011771号