写博客真是考验自己的耐力,不过能从中获得很多,有些知识也在不断丰富中
指针函数
没写错,先看下指针函数,它就是一个函数,返回的是一个指针
int * func(arg){}
类似上面这种,看下具体实例:
#include <stdio.h>
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 <stdio.h>
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<sizeof(powerseq)/sizeof(POWERSEQ)){
(powerseq[i].func)();
printf("delay:%d\n",powerseq[i].delay);
i++;
}
printf("close\n");
return 0;
}
结果:
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 <stdio.h>
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相当于库函数,这个库函数里有很多逻辑处理,主函数呢也有很多逻辑处理,我们只要改变不同的参数,就是不同的函数,就有不同的逻辑功能,非常灵活。
不过我觉得,什么叫回调,就是返回去调用吗?当发生一个事件的时候,这个函数又开始被调用,后面再继续研究。。。。。