首页 > 其他分享 >函数指针

函数指针

时间:2024-04-21 15:55:26浏览次数:26  
标签:typedef 函数 int void func 函数指针

一、函数指针

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

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

为了方便使用: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

相关文章

  • 函数指针和指针函数
    函数指针:函数的指针,即指向函数的指针//函数intfun_add(inta){//function....}//定义一个函数指针int(fun1*)(int);//赋值的两种方法fun1=&fun_addfun1=fun_add第二种赋值方法和普通的函数很像,建议用第一种做区分  指针函数:返回指针的......
  • 用函数指针变量做参数,求最大值、最小值和两数之和
    include<stdio.h>include<stdlib.h>include<malloc.h>intmax(int,int);intmin(int,int);intadd(int,int);voidprocess(int,int,int(fun)(int,int));voidmain(){inta,b;scanf("%d%d",&a,&b);process(a,b,max);process(a,......
  • 用函数指针数组来实现对一系列函数的调用
    include<stdio.h>intadd(inta,intb);intsub(inta,intb);intmax(inta,intb);intmin(inta,intb);voidmain(){inta,b,i,k;int(*func[4])(int,int)={add,sub,max,min}//定义指针数组,并对其赋初始值printf("selectoperator(0-add,1-sub,2-max,3-min)......
  • 使用函数指针实现转移表
    用函数指针实现简单的计算器功能。使用函数指针模拟实现计算器的功能大大减少了代码量,只需要创建一个函数指针数组,zi’azia其中存放着四钟加减乘除的算法。代码如下#include<stdio.h>intadd(inta,intb){ returna+b;}intsub(inta,intb){ returna-b;......
  • 深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】
    一.数组指针变量1.什么是数组指针变量?说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数......
  • 指针数组、数组指针、函数指针、指针函数
    数组指针:是指向数组的指针,它还是一个指针,只不过指向数组而已行指针定义形式:int(*p)[10]一定要加(),因为[]优先级高于*,所以必须要(*p)指一行,这里10为列的元素个数例1:二维数组数值为1-12,用行指针定义输出8例2:用行指针传参,2*3数组,输出第二行指针数组:实际是一个数组,长度是......
  • 函数指针数组(转移表)
    函数指针数组,首先是一个数组,其次其中存储的数据类型是函数指针,所以我们可以通过使用函数指针数组来调用不同的函数。接下来为大家展示他的基本使用方法(模拟计算器)函数指针数组结构   int(*arr[])(intx,inty)={NULL,Add,Sub,Mul,Div};其中NULL,Add,Sub,Mul,Div......
  • cpp:"函数指针"的方法
    目录仿函数类std::function类Lambda类lambda函数函数对象有这几类:仿函数类即重载operator()classFuncObjType{public:voidoperator()(){cout<<"HelloC++!"<<endl;}};std::function类即上文中func_typestd::function<float(float,float)>......
  • 滴水逆向笔记系列-c语言总结6-20.多级指针 数组指针 函数指针-21.位运算-22.内存分配
    第二十课c语言13多级指针数组指针函数指针1.多级指针反汇编一二级指针可以看到p1==*(p1+0)==p1[0]本来一直没想懂为什么是movsxecx,byteptr[eax],是byte,才发现p1是char类型,所以才得用movsx拓展(p1+2)==p1[2],指针可以用和[]取值,他们是一样的(((p3+1)+2)+3)==p3[......
  • [C++]C++函数指针总结
    指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。先声明几个指针放着做例子:例一:int*......