//函数指针 /* 函数指针是指指向函数的指针变量,通常我们说的指针变量是指向一个字符型,整型,数组等变量, 而函数指针是指向函数。函数指针可以向一般函数一样,用于调用函数,传递函数 */ //一下栗子中声明了指针变量p,指向函数max #include <stdio.h> int max(int x, int y) { return x>y?x:y; } int main01() { //p是函数指针 int (*p)(int, int) = &max; int a,b,c,d; printf("请输入三个数字:"); scanf("%d %d %d",&a,&b,&c); //与直接调用函数等价 d = max(max(a,b),c); printf("max=%d\n", d); /* 请输入三个数字:11 33 22 max=33 */ } //回调函数 /* 函数指针作为某个函数的参数 函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。 简单讲:回调函数是由别人的函数执行时调用你实现的函数。 以下是自知乎作者常溪玲的解说: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话. 过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货 在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数, 店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。 */ //举个栗子 /* 实例中 populate_array 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。 实例中我们定义了回调函数 getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给 populate_array 函数。 populate_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。 */ //回调函数 #include <stdio.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() { int myarray[10]; populate_array(myarray, 10, getNextRandomValue); for (int i=0;i<10;i++) { printf("%d\n",myarray[i]); } /* 41 18467 6334 26500 19169 15724 11478 29358 26962 24464 */ } //分析一下代码的逻辑 /* 首先传入了myarray,而在populate_array中接收的是指针,说明可以在populate_array中的修改, 会影响到我们在main函数中的打印,我们传入size无需介绍,然后最后一个参数是函数的指针, 我们在直接调用指向函数的指针的时候,会自动找到指针指向的函数,从而获取rand()随机值,赋给arr[i] 从而在main()中打印 */ //关于传递函数指针,如何传递,我们定义了int arr(int a, int b), //那么传递指针的时候要保持返回值类型和参数类型一致即可,名字随意,然后在函数名前加上*表示接收的是指针类型即可 //笔记 /* 有关于size_t,size_t是一种数据类型,近似于无符号整型,但是容量范围一般大于int和unsigned。 这里使用size_t是为了保证arraySize有足够大的容量来储存可能大的数组 */