函数指针
代码参考菜鸟教程
#include<stdio.h> int max(int x,int y){ return x>y?x:y; } int main(void){ //p是函数指针 int(*p)(int , int)=&max;//&可以省略 //int(*q)(int , int)=max;//&可以省略 int a,b,c,d; printf("请输入三个数字"); scanf("%d %d %d",&a,&b,&c); d=p(p(a,b),c); printf("最大的数字是:%d",d); return 0; }
运行结果如下
总结:函数指针就是利用指针指向函数,即指向函数的指针变量。在学习C语言的时候大家都很清楚指针是什么了,我们平常使用指针的时候主要让指针指向某个变量(int类型、double类型等等),指针的本质就是指向变量的地址,那么可以延伸一下,指针也可以指向函数,在这种情况下,指针的类型就是函数的返回值类型。
需要掌握的是函数指针的声明方式:
int(*p)(int,int)=&max;
int(*q)(int,int)=max;
上面两种声明方式都正确,p和q就是函数指针变量,(int,int)是函数指针所指向的函数的参数表,等于号后面是函数名(可加&也可不加)。
回调函数
回调函数就是一个被作为参数传递的函数。上面刚刚说了函数指针,那么函数指针变量就可以作为参数传递给另一个函数,这种情况下函数指针指向的函数就是回调函数。
也可以这样来理解,你给小姐姐留下了微信,你想让她加你,这个时候你留的微信就是一个函数指针,指向的是你自己,当小姐姐那边对你有好感了,她就会通过你的微信号加你,这个过程中相当于小姐姐使用了你留下的函数指针变量(参数),所以你就被回调了,回调的结果就是你俩开始唠嗑。
下方贴一下菜鸟教程提供的代码,个人感觉代码中注释有问题,就索性改了下。
#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 myarray[10]; populate_array(myarray,10,&getNextRandomValue); for(int i=0;i<10;i++){ printf("%d ",myarray[i]); } return 0; }