【不在混淆的C】指针函数、函数指针、回调函数
一、指针函数
函数的返回值是指针类型。
int* fun(int a,int b);
指针函数使用:
返回字符串
这里要注意,"1234567890abc"是字符串常量,*p指向的字符串地址,返回的是这个地址,因为字符串常量不会因为函数消亡而释放,所有主函数依然可以访问到地址的内容。
#include <stdio.h> char* str(){ char *p="1234567890abc"; return p; } void main(){ printf("%s",str()); }
返回申请堆空间的内容
#include <stdio.h> int* str(){ //申请堆空间 int *p=malloc(20*sizeof(int)); //打印地址 printf("addr p:%d\r\n",p); //数据存储 for(int i=0;i<20;i++){ p[i]=i; } return p; } void main(){ //调用 int *p=str(); //地址 printf("addr p:%d\r\n",p); //数据输出 for(int i=0;i<20;i++) { printf("%d",p[i]); } //释放堆空间 free(p); }
二、函数指针
如int类型指针(int* p)一样,是一种指针类型
定义了一个函数,那么编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
定义形式:
返回值类型 (*函数指针变量名)(形参1类型,形参2类型,…)
如函数原型:
int fun1(int a,int b);
函数指针为:
int (*funp)(int,int)
如函数原型:
void fun2();
函数指针为:
void (*fun2p)();
使用时直接将函数名赋值给函数指针(指针变量名)即可,如:
#include <stdio.h> //找最大值 int max(int a,int b){ if(a>b) return a; return b; } //找最小值 int min(int a,int b){ if(a<b) return a; return b; } void main(){ //定义函数指针变量 pfun int (*pfun)(int,int); //赋值函数指针,找最大值 pfun=max;//或者为&max int c=pfun(10,20); printf("%d\r\n",c); //赋值函数指针,找最小值 pfun=min; //或者为&min c=pfun(10,20); printf("%d\r\n",c); }
输出:
三、 回调函数
回调函数其实就是使用函数指针作为函数的形参
#include <stdio.h> //找最大值 int max(int a,int b){ if(a>b) return a; return b; } //找最小值 int min(int a,int b){ if(a<b) return a; return b; } //函数入口 int all(int a,int b,int (*pfun)(int,int)){ return pfun(a,b); } void main(){ int c=0; //找最大值调用 c=all(10,20,max); printf("%d\r\n",c); //找最小值调用 c=all(10,20,min); printf("%d\r\n",c); }
无返回值和无参数
#include <stdio.h> void pa(){ printf("aaaaaaaaaaaa\r\n"); } void pb(){ printf("bbbbbbbbbbbb\r\n"); } int pall(void (*pfun)()){ pfun(); } void main(){ pall(pa); pall(pb); }
执行结果
本人视频号:https://space.bilibili.com/162091292