函数指针与回调函数_开发者

函数指针与回调函数_开发者_02

​函数名可以当作一个常量来看待。

它保存了函数的内存地址,函数内存地址存储了函数的开始执行的位置,

使用指针保存函数的地址。指向函数的指针被称为函数指针。

函数指针与回调函数_回调函数_03

通过函数指针,可以灵活的调用各种形式(参数列表)相同,但是功能不同的函数。

这样做大大增加了代码的灵活程度。

比如定义三个具有相同形参和返回值的函数,分别计算两个数相加,相减,相乘​

函数指针与回调函数_开发者_04

​在main函数中,定义两个整数值a,b。

定义有两个int参数,返回值是整数的函数指针func_ptr,分别指向上面定义的三个函数。​

函数指针与回调函数_函数指针_05

函数指针与回调函数_回调函数_06

​我们通过直接调用原函数,和调用函数指针来得到计算结果,可以发现:

1) func_ptr存储的值和函数名中的地址相等。

2) 直接调用函数得到的结果,和通过函数指针调用函数得到的结果相同。

 和其他类型的变量一样,函数指针也可以作为函数参数传递给函数。

函数指针与回调函数_开发者_07

函数名本身就是函数指针,可以作为参数来传递给compute_func函数。​

函数指针与回调函数_回调函数_08

函数指针与回调函数_开发者_09

结果正常调用。

函数指针与回调函数_开发者_10

​将sum,difference,product 作为参数赋值给 compute_func的过程叫做回调函数的注册。

compute_func函数中调用sum,differenct,product的过程叫做回调函数的调用。​

 

​应用场景:

有两个角色,分别为某功能函数的开发者,和该功能函数的使用者。

正常场景是使用者直接调用开发者开发的功能函数,得到返回结果即可。

但是开发者开发的功能函数某些逻辑需要依赖使用者的行为,根据使用者的不同行为,做出不同的逻辑处理。这个时候就需要使用回调函数了。

开发者会开发的通用功能函数会预留一个口子(函数指针参数)。使用该函数的时候,使用者需要给函数传递一个函数指针,这个函数指针所指向的函数是使用者开发的,在功能函数运行的时候,通过传入的函数指针调用使用者开发的函数的过程就是一个回调的过程。

而使用者开发的这个函数,就叫做回调函数了。​

函数指针与回调函数_开发者_11

​基于上面的理论,我们作为使用者,可以创造一个自己的回调函数。做为参数,传递给compute_func。

 ​函数指针与回调函数_开发者_12

函数指针与回调函数_回调函数_13

​一般来说,开发者和使用者不是同一个人,并且开发者开发的功能函数都会比较复杂,

另外,无论回调函数实现什么功能,只要使用者传入的回调函数与函数指针参数形参一致即可。​