目录
一、前言
话说指针是C的灵魂,若在简单的程序里使用指针,那就不必要了,只会增加代码的繁琐性,只有在大的工程项目里面,指针才会体现的淋漓尽致,这里将简单的介绍一下函数指针和回调函数,回调函数也是经常用的,它的本质就是函数指针。
二、函数指针
1.定义
函数指针顾名思义是 指向函数的指针变量,我们都知道一个指针可以指向变量,但也可以指向一个函数,我们可以通过这个指针访问到这个变量的地址,进而获取该变量的值,同样的,函数也是如此,调用函数,传递参数等。
定义: 原函数返回类型(*指针变量)(原函数参数列表)
#include <stdio.h>
void function_1(int a)
{
printf("function_1: %d\n",a);
}
int main()
{
void (* cp)(int);//定义一个函数指针
cp = function_1;//该指针指向function_1入口
cp(2);//调用该函数
}
这里呢,可以使用cp指针来间接的调用function_1,可以理解为cp这个就是function_1,括号里面的东西就是参数。
扫描二维码关注公众号,回复:
14895641 查看本文章
输出
定义和指向一起
#include <stdio.h>
void function_1(int a)
{
printf("function_1: %d\n",a);
}
int main()
{
void (* cp)(int);//定义一个函数指针
cp = function_1;//该指针指向function_1入口
cp(2);//调用该函数
void (* cp_2)(int) = function_1;//定义、指向
cp_2(3);
}
2. 函数指针作为形参
这里的将把函数指针作为形参传递,他的实质和普通变量一样,就是赋值作用。
#include <stdio.h>
void function_1(int a)
{
printf("function_1: %d\n",a);
}
void function_2(int a)
{
printf("function_2: %d\n",a);
}
void function_3(int a)
{
printf("function_3: %d\n",a);
}
//函数指针作为形参 实质:void(* cp)(int) = function_1
void call_f(void(* cp)(int),int a)
{
cp(a);
}
int main()
{
call_f(function_1,1);
call_f(function_2,2);
call_f(function_3,3);
}
3.函数指针数组
跟普通变量一样,也可以定义一个函数指针的数组,里面可以存放多个函数的地址,通过数组下标访问。
#include <stdio.h>
void function_1(int a)
{
printf("function_1: %d\n",a);
}
void function_2(int a)
{
printf("function_2: %d\n",a);
}
void function_3(int a)
{
printf("function_3: %d\n",a);
}
int main()
{
void (* p_arr[3])(int) = {function_1,function_2,function_3};
p_arr[0](1);
p_arr[1](2);
p_arr[2](3);
}
三、回调函数
回调函数,就是把函数的指针做用另一个函数,当这个被调用时,就会指向之前的所指的函数,然后通过这个函数去调用回调函数。他可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。
简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
回调函数隐蔽性比较高,所以一般很难去发现谁去调用它或者在哪被调用,当工程文件比较多的时候,回调函数的作用就显得十分优秀了,而且维护起来很容易。一般和结构体搭配使用,下面的代码可以细品下~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int age;
int number;
}stdr;
stdr std_t ={
.age = 1,
.number = 2
};
typedef struct
{
char *name;
void (* _cp)(stdr *);
}work_list;
void callback_function_1(stdr *std_t);
void callback_function_2(stdr *std_t);
void callback_function_3(stdr *std_t);
work_list work_list_t[3]=
{
{"f1",callback_function_1},
{"f2",callback_function_2},
{"f3",callback_function_3},
};
void callback_function_1(stdr *std_t)
{
printf("[callback_function_1]$ ");
printf("age:%d,number:%d\n", std_t->age,std_t->number);
}
void callback_function_2(stdr *std_t)
{
printf("[callback_function_2]$ ");
printf("age:%d,number:%d\n", std_t->age,std_t->number);
}
void callback_function_3(stdr *std_t)
{
printf("[callback_function_3]$ ");
printf("age:%d,number:%d\n", std_t->age,std_t->number);
}
void work_callback_function(char *inchars)
{
for(int i =0 ;i<3;i++)
{
if(strcmp(work_list_t[i].name,inchars)==0)
return work_list_t[i]._cp(&std_t);
}
printf("NO this function\n");
}
void inpu_s(char *inchars)
{
printf("[Lng-> ]$ ");
scanf("%s",inchars);
}
void loop()
{
char inchars[20];
while(1)
{
inpu_s(inchars);
work_callback_function(inchars);
}
}
int main()
{
loop();
}