🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 15. 函数指针与回调函数 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: ~~~ typedef int (*fun_ptr)(int,int)//声明一个指向同样参数,返回值得函数指针类型 ~~~ 例子: ![](https://user-gold-cdn.xitu.io/2019/12/17/16f13d16d586cfd6?imageslim) ~~~ int max(int num1, int num2) { return (num1 > num2) ? num1 : num2; } void main() { //定义一个返回值为 int 类型,参数为 (int,int) 形式的函数指针 int (*p)(int, int) = *max; int a, b, c, d; printf("请输入三个数字:\n"); scanf("%d %d %d", &a, &b, &c); //与直接调用函数等价,d = max(max(a,b),c); d = p(p(a, b), c); printf("最大数字是: %d \n", d); } ~~~ **回调函数** 函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。 简单讲:回调函数是由别人的函数执行时调用你实现的函数。 例子: 例子中 populate\_array 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。 实例中我们定义了回调函数 getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给 populate\_array 函数。 populate\_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。 ~~~ #include <stdlib.h> #include <stdio.h> //回调函数 void populate_array(int *array, size_t arraySize, int(*getNextValue)(void)) { printf("array 地址:%p \n", array); for (size_t i = 0; i < arraySize; i++) { array[i] = getNextValue(); printf(" array[%d] ,存储值:%d \n", i, array[i]); } } //获取一个随机数 int getNextRandomValue(void) { return rand(); } void main() { //回调函数 int array[10]; printf("Int array 地址:%p \n", array); populate_array(array, sizeof(array)/sizeof(array[0]), getNextRandomValue); for (int i = 0; i < sizeof(array)/sizeof(array[0]); ++i) { printf(" array[%d] , 对应值为:%d \n", i, array[i]); } } ~~~ 输出: ~~~ Int array 地址:0x7ffeebf1a650 array 地址:0x7ffeebf1a650 array[0] ,存储值:16807 array[1] ,存储值:282475249 array[2] ,存储值:1622650073 array[3] ,存储值:984943658 array[4] ,存储值:1144108930 array[5] ,存储值:470211272 array[6] ,存储值:101027544 array[7] ,存储值:1457850878 array[8] ,存储值:1458777923 array[9] ,存储值:2007237709 array[0] , 对应值为:16807 array[1] , 对应值为:282475249 array[2] , 对应值为:1622650073 array[3] , 对应值为:984943658 array[4] , 对应值为:1144108930 array[5] , 对应值为:470211272 array[6] , 对应值为:101027544 array[7] , 对应值为:1457850878 array[8] , 对应值为:1458777923 array[9] , 对应值为:2007237709 ~~~