通俗易懂C语言--函数指针
写博客真是考验自己的耐力,不过能从中获得很多,有些知识也在不断丰富中
指针函数
没写错,先看下指针函数,它就是一个函数,返回的是一个指针
int * func(arg){}
类似上面这种,看下具体实例:
#include
int * func()
{static int sum = 1;int *p = ∑return p;
}int main(void)
{int *p;p= fun();//这两句可以直接写成int *p = func(); printf("sum:%d\n", *p);return 0;
}
使用指针函数需要注意传递的值最好是静态的,如果是局部的,如果不是立即使用,很大概率你取得的这个数就不一样了
函数指针
函数指针就是一个指针,该指针的地址指向的是一个函数,定义形式:
int (*func)(void);
假如有个函数:
int Sum (void){int a=1,b=1,sum;sum=a+b;return sum;
}
那么这个可以这样写:
//函数指针变量 = 函数名;
func = Sum;
看到这里有没有觉得函数名字就是这个函数的入口地址一样
int Sum (void){int a=1,b=1,sum;sum=a+b;return sum;
}int main(void)
{int (*func)(void);func=Sum;printf("value:%d\n",func());return 0;
}
函数指针实际运用有哪些呢(我能想到的)
遍历函数,回调函数
当有很多个函数需要在一个函数中无规律的遍历,就像EC中的时序一样,什么时候拉高,什么时候拉低,咱们现在来写一个样例,把之前的知识运用起来:
#include typedef void (*FUNC)(void);//定义一个函数指针//定义一个结构体
typedef struct _POWERSEQ
{FUNC func; //函数指针作为结构体成员定义int delay;
} POWERSEQ;//定义几个拉高拉低的函数
void PCIERESET_HI(void){printf("PCIE HI\n");
}void PCIERESET_LO(void){printf("PCIE LO\n");
}void POWER_HI(void){printf("POWER HI\n");
}void POWER_LO(void){printf("POWER LO\n");
}//初始化结构体
POWERSEQ powerseq[]=
{{ PCIERESET_HI, 1},{ PCIERESET_LO, 2},{ POWER_HI, 3},{ POWER_LO, 4}
};int main(void)
{int i=0;while(i
结果:
PCIE HI
delay:1
PCIE LO
delay:2
POWER HI
delay:3
POWER LO
delay:4
close
在C语言里,既然有这么个功能,那么就一定有它存在的理由,就如上面的,假如让你去遍历一下类型相同的超多函数,你总不可能一个一个的去写吧。
回调函数
回调函数目前来说理解的也不是太深入,仅作参考:
什么叫回调函数呢,就是一个函数a调用函数b,函数b的参数是函数c,它凭什么可以将函数c作为参数呢,因为函数b的参数是一个函数指针。
回调函数在UEFI的代码中经常用到,特别是进行setup设置的时候,先看一下基础的
//写三个函数c
void Callback1(){printf("this is callback1 \n");
}void Callback2(){printf("this is callback2 \n");
}void Callback3(){printf("this is callback3 \n");
}//写一个函数b
void swap(void (*Callback)()){printf("b callback start\n");Callback();printf("b callback close\n");
}//写一个a函数void main(){printf("main start\n");swap(Callback1);swap(Callback2);swap(Callback3);printf("main close\n");}//其实也可以这么写:
#include typedef void (*CallBack)();void Callback1(){printf("this is callback1 \n");
}//写一个函数b
void swap(CallBack callback){callback();printf("b callback close\n");
}//写一个a函数void main(){printf("main start\n");swap(Callback1);printf("main close\n");}
看了很多写有关回调函数的,都喜欢瞎写一些理论,实际写代码去仔细说的又没几个,就我目前最能理解的一段话就是说这个swap相当于库函数,这个库函数里有很多逻辑处理,主函数呢也有很多逻辑处理,我们只要改变不同的参数,就是不同的函数,就有不同的逻辑功能,非常灵活。
不过我觉得,什么叫回调,就是返回去调用吗?当发生一个事件的时候,这个函数又开始被调用,后面再继续研究。。。。。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
