首页 > 其他分享 >函数指针与函数回调

函数指针与函数回调

时间:2023-04-30 19:14:32浏览次数:29  
标签:return 函数 int func 函数指针 回调 指针

  1、函数指针   C/C++中可以使用指针指向一段代码,这个指针就叫函数指针,假设有这样一段代码:

#include <stdio.h>
int func(int a) {
  return a + 1;
}
void main() {
   int (*f)(int) = func;
   printf("%p\n", f);
}

定义了一个函数func,然后使用指针变量f指向该函数,然后打印出变量f指向的地址:

./a.out
0x400526
函数指针本质也是一个指针,只不过这个指针指向的不是内存中的一段数据而是内存中的一段代码,在这个示例中指向了内存地址0x400526,在这个地址中保存了函数func的机器指令。函数调用,就是 CPU 跳转到某个函数的首地址,继续执行。但仅仅知道函数的首地址,是不够的!因为在调用之前,主调函数还需要为被调函数准备参数。   2、回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。   为什么要使用回调函数? 在调用库函数时,我们往往不会去修改库函数的内容,而我们却又想通过一个函数实现多个函数的功能,使用回调函数,将会大大的减少我们的。如,我们在做一个特大项目时,某个函数需要调用其它不同的函数实现不同的功能,假设可供调用的函数有100个,那我们是不是要写封装100个这样的函数?这样可以是可以,但很累人,一分钟不加班就不自在的朋友可以考虑下。但引用回调函数机制会大大减少我们工作量。
#include<stdio.h>
int CallbackFunction1() {
    printf("This is CallBack Function1\n");
    return 0;
}
int CallbackFunction2() {
    printf("This is CallBack Function2\n");
    return 0;
}
int Handle(int (*p)()) {
    (*p)();
    return 0;
}
int main() {
    Handle(CallbackFunction1);
    Handle(CallbackFunction2);
}
 
 
#include <stdio.h>
int op(int a,int b,int (*p)(int,int));
int __add(int a,int b);
int __sub(int a,int b);
int __mul(int a,int b);
int main() {
    int a = 2,b = 3,re;
    re = op(a,b,__add);
    printf("%d\n",re);
    return 0;
}
int op(int a,int b,int (*p)(int,int)) {
    return p(a,b);
}
int __add(int a,int b) {
    return a+b;
}
int __sub(int a,int b) {
    return a - b;
}
int __mul(int a,int b) {
    return a*b;
}
3、回调 回调(call back)是一个过程,回调函数(call back funciton)是这个过程中的一个函数; 再明确一点,回调函数和普通函数没有任何差别,是的,没有任何差别,你想怎么写就怎么写,只要能满足需求。 回调的本质:把指向回调函数的指针作为参数传给其他函数,其他函数通过这个指针就能使用回调函数。 回调过程涉及3个部分,调用者、使用回调函数的函数、回调函数。
#include<stdio.h>
//回调函数1
int cbfunc1(int a, int b) {
    return a - b;
}
//回调函数2
int cbfunc2(int a, int b) {
    return a*2 - b;
}
//使用回调函数的函数
int func(int (*cb)(int, int)) {
    int op1 = 10;
    int op2 = 25;
    int ret = cb(10, 25);
    return ret;
}
//调用者
int main() {
    int ret1, ret2;
    ret1 = func(cbfunc1);
    ret2 = func(cbfunc2);
    printf("ret1 = %d\n", ret1);
    printf("ret2 = %d\n", ret2);
    return 0;
}
输出结果:
ret1 = -15
ret2 = -5

int func(int (*cb)(int, int)) 的参数是一个函数指针

回调过程:main函数调用func函数,把cbfunc作为指针参数传给func, func运行时会通过这个指针去调用指向的函数。 说白了就是,main调用func,func调用cbfunc(单线程的情况下),特殊的地方就是func通过指针调用cbfunc。   用途: 调用不在同一区域的函数,比如动态库想调用外边的函数,就可以写一个回调;用void指针可以让回调更灵活。    

标签:return,函数,int,func,函数指针,回调,指针
From: https://www.cnblogs.com/liujiarui/p/17365633.html

相关文章

  • Excel 使用VBA 自定义函数
     启用Excel开发工具    打开Excel的VBA(ALT+F11)   新键VBA工程模块写入自定义函数FunctionHexIPAddr(strIPAddrAsString,isAscAsBoolean)AsStringDimarry,bit0AsString,bit1AsString,bit2AsString,bit3As......
  • 3-函数
    函数:是指一段可以直接被另一段程序调用的程序或代码。使用场景:在企业的OA或其他的人力系统中,经常会提供的有这样一个功能,每一个员工登录上来之后都能够看到当前员工入职的天数。而在数据库中,存储的都是入职日期,如2000-11-12,那如果快速计算出天数呢?在做报表这类的业......
  • 浅谈欧拉函数
    求法设一个数x的各质因子为$p_1,p_2,...,p_n$则$\phi(x)=x-\frac{x}{p_1}-\frac{x}{p_2}-...-\frac{x}{p_n}+\frac{x}{p_1*p_2}+\frac{x}{p_2*p_3}+...=x*\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}*...*\frac{p_n-1}{p_n}$性质性质1若$n,m$互质,则$\phi(n*m)=\phi(n)*\phi(m)$证......
  • Delphi原子操作函数介绍
    一、Delphi的原子操作函数在System.SyncObjs单元中,有一个TInterlocked的密封类,其十多个类函数(classfunction)其实都是调用的System单元的原子操作函数,只是封装得更容易理解。使用方法:如对一个数值加一,则直接b:=TInterlocked.Increment(a);或TInterlocked.Increment(a);,不用创建......
  • C语言函数大全-- s 开头的函数(3)
    C语言函数大全本篇介绍C语言函数大全--s开头的函数(3)1.sleep1.1函数说明函数声明函数功能unsignedintsleep(unsignedintseconds);它是C语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为......
  • linux c/c++程序集成python库,实现调用python函数
    为了提高开发效率,扩展开发程序的功能,我们经常会在我们的linuxc/c++进程里调用外部脚本,例如lua、python,下面,介绍下如何在自己的linuxc/c++代码里调用python脚本里的函数和类,并且将python库集成到我们自己的进程目录里,这样就不依赖系统环境是否存在python及其版本要求。 ......
  • 06 - react的类组件中的状态state render函数 this指向问题 事件绑定
    //注册事件importReactDomfrom"react-dom"import{Component}from"react"//类组件中的状态通过this.state.xxx来获取状态classHelloextendsComponent{//事件对象eventhandleClick(e){console.log(this)//udnefiend使用箭头函数解决this......
  • matlab出现函数或变量'fun1'无法识别出错fmincon(line 562)
    函数或变量'fun1'无法识别出错fmincon(line562)原因有两个1.函数名要与函数文件名相同如这里我的函数名是fun1,那么这个文件也要命名为fun12.路径出现了问题通常情况下matlab运行的时候是在C盘对应的bin目录下,但是我保存的这些代码文件并不是再C盘而是在D盘所以我们要进行手......
  • react的类组件和函数组件 -- 状态 state
    //函数组件是无状态的既没有数据的类似vue组件中的data数据//类组件是有状态的组件是有数据的是双向绑定的数据是数据驱动视图的负责UI的视图更新(单个组件的私有数据组件之间的数据是独立的)importReactDomfrom"react-dom"import{Component}from"react......
  • 定义函数时不要使用可变类型作为参数的默认值
    《流畅的Python》第8章8.4.1小节 可变默认值导致的这个问题说明了为什么通常使用None作为接收可变值的参数的默认值。类名.__init__.__defaults__:查看类中形式参数的默认值函数名.__defaults__属性:查看形式参数的默认值#形式参数L是可变类型时隐藏的问题defadd_end(L=[......