函数指针

一、函数指针

函数指针:指向存放函数空间首地址的指针变量

函数指针的定义方式: 函数返回值类型(*指针变量名)(函数参数列表);

为了方便使用: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;
}
posted @ 2024-04-21 15:50  梨子Li  阅读(10)  评论(0编辑  收藏  举报