例如:voidfunc()如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。

还有面相对象编程时,用class给封装起来也是掩人耳目,不要被外表所迷惑。

而回调就成了一个高层调用底层,底层再回过头来调用高层的过程。

而回调就成了一个高层调用底层,底层再**回**过头来**调**用高层的过程。

下面是两个函数指针的声明>int(*f)(int,float);>>int*(*g)(int,float);前者把**f**声明为一个函数指针,它所指的函数接受两个参数,分别是一个整型值和浮点型值,并返回一个整型值。

假如回调函数中包含文件处理之类的低速处理,调用方等不得,需要把同步调用改为异步调用,去启动一个单独的线程,然后马上执行后续代码,其余的事让线程慢慢去做。

**一个简单的回调函数实现**下面创建了一个sort.dll的动态链接库,它导出了一个名为CompareFunction的类型–typedefint(__stdcall*CompareFunction)(constbyte*,constbyte*),它就是回调函数的类型。

实际上,回调并不是你我两方的互动,而是ABC的三方联动。

**实现**下面创建了一个sort.dll的动态链接库,它导出了一个名为CompareFunction的类型–1|`typedefint(__stdcall*CompareFunction)(constbyte*,constbyte*)`—|—,回调函数,就是由你自己写的。

若是故意编写成此递归调用,并设好终止条件,倒是很有意思。

例如,写一个快速排序函数供他人调用,其中必包含比较大小。

对于B来说,一种被动得到信息,一种是主动去得到信息,有人给这两种方式术语,叫信息的push,和信息的pull。

那么,回调函数是个什么鬼呢?它和函数到底有何异同?既然已经有了函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。

我觉得要真正理解一个概念,必须要先理解它存在的意义,也就是它为什么要存在,它能带来什么方便之处。

网上的很多文章,提到这两个概念时,只是笼统地说阻塞式回调发生在主调函数返回之前,却没有明确这个主调函数到底是起始函数还是中间函数,不免让人糊涂,所以这里特意说明一下。

尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。

那么,回调函数是个什么鬼呢?它和函数到底有何异同?既然已经有了函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。

这就说明了主函数不用等待回调函数执行完,可以接着执行自己的代码。