一、函数指针
函数指针:指向存放函数空间首地址的指针变量
函数指针的定义方式: 函数返回值类型(*指针变量名)(函数参数列表);
为了方便使用:typedef 函数返回值类型(*指针变量名)(函数参数列表);
typedef int (*ptrFunc)(int, int);//typedef定义了一种ptrFunc的类型,并定义这种类型为指向某种函数的指针,这种函数一两个int为参数并返回int类型
二、回调函数
F1调用F2的时候,通过参数传给函数F2一个函数F3的指针,执行F2时,F2调用了F3,这个动作叫回调, F3就是回调函数
int func1(int a, int b) //回调函数
{
...
return 0;
}
int func2(int a, int b, int (*ptr)(int, int))
{
ptr(a, b); //回调
return 0;
}
int func3()
{
func2(a, b, func1);
}
三、函数注册
函数注册就是把函数指针作为参数传递出去,可以理解为将特定的函数与函数指针进行关联的过程。函数注册允许程序动态地选择要在运行时执行的函数,从而增加了程序的灵活性和可扩展性。
函数注册包括两个主要步骤:
1、定义函数指针类型: 首先需要定义一个函数指针类型,以便能够声明指向函数的指针。这样可以将函数指针作为参数传递给其他函数,或者将其存储在数据结构中。
typedef int (*ptrFunc)(int, int);
2、注册函数: 将函数指针与特定的事件、条件或标识符相关联。这通常通过将函数指针存储在数组、列表、映射或其他数据结构中来完成。
ptrFunc callbacks[10]; // 一个数组,存储函数指针
callbacks[0] = &func; // 将函数指针注册到数组中
在注册完成后,当特定条件满足时,可以通过调用函数指针来执行注册的函数,从而实现了回调或事件处理的功能。
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
typedef void (* func_t)(void); //定义了一个func_t的函数指针类型
typedef struct reg_func_s
{
int clock;
func_t action;//用func_t类型定义了一个函数指针action
} reg_func_t;
void getup(void)
{
printf("It's time to get up now.\n");
return ;
}
void study(void)
{
printf("It's time to study now.\n");
return ;
}
int main (int argc, char **argv)
{
int clock = 0;
int i;
/*函数注册*/
reg_func_t reg_funcs[] =
{
{7, getup},
{8, study},
};
for(clock=7; clock<=10; clock++)
{
for(i=0; i<ARRAY_SIZE(reg_funcs); i++)
{
if( reg_funcs[i].clock == clock )
reg_funcs[i].action();
}
sleep(1);
}
return 0;
}
标签:typedef,函数,int,void,func,函数指针
From: https://www.cnblogs.com/LiBlog--/p/18147820