18.函数指针与回调函数
- 1.函数指针
函数指针是指向函数的指针变量。
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以像一般函数一样,用于调用函数、传递参数。
函数指针类型的声明:
typedef int (*fun_ptr)(int,int); //声明一个指向同样参数、返回值的函数指针类型
以下实例声明了函数指针变量 p,指向函数 max:
#include <stdio.h>
int max(int x, int y){
return x > y ? x:y;
}
int main(){
//p 是函数指针
int (* p)(int, int) = &max; //&可以省略
int a,b,c,d;
printf("请输入三个数字:");
scanf("%d %d %d\n", &a, &b, &c);
//等价于: d = max(max(a,b),c);
d = p(p(a, b),c);
printf("最大的数字是: %d\n", d);
return 0;
}
- 2.回调函数
函数指针作为某个函数的参数
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
简单讲:回调函数是由别人的函数执行时调用你实现的函数
#include <stdio.h>
#include <stdlib.h>
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
for(size_t i=0; i<arraySize; i++){
array[i] = getNextValue();
}
}
//获取随机值
int getNextRandomValue(void)
{
return rand();
}
int main(void)
{
int marray[10];
/* getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/
populate_array(marray, 10, getNextRandomValue);
for(int i = 0; i < 10; i++){
printf("%d\n", marray[i]);
}
return 0;
}