通俗易懂C语言--函数指针

写博客真是考验自己的耐力,不过能从中获得很多,有些知识也在不断丰富中

指针函数

没写错,先看下指针函数,它就是一个函数,返回的是一个指针

int * func(arg){}

类似上面这种,看下具体实例:

#include <stdio.h>
int * func()
{
    static int sum = 1;
    int *p = &sum;
    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相当于库函数,这个库函数里有很多逻辑处理,主函数呢也有很多逻辑处理,我们只要改变不同的参数,就是不同的函数,就有不同的逻辑功能,非常灵活。

不过我觉得,什么叫回调,就是返回去调用吗?当发生一个事件的时候,这个函数又开始被调用,后面再继续研究。。。。。

おすすめ

転載: blog.csdn.net/u011397314/article/details/121382078