zoukankan      html  css  js  c++  java
  • 彻底搞懂函数指针和指针函数回调函数

    参考:http://www.cnblogs.com/CBDoctor/archive/2012/10/15/2725219.html

    背景:以前看别人的代码,总是会看到函数指针的用法。(当时感觉,好高打上,代码移植性真好!绝必技术大拿呀!)

    今天:工作任务很多,但是不想做(嘿嘿,偷懒一会吧,毕竟今天周五,哈哈...),整理一下函数指针的用法吧。

    温馨提醒:读者千万不要着急,从头到尾认真的看一遍,保证可以搞懂(针对新手,或者模糊的人,高手可以喷喷)。

    1. 首先看看通常调用函数的例子

    #include <stdio.h>
    
    void MyFun(int x);  //此处也可以写成 void MyFun(int);
    
    int main(void)
    {
      MyFun(10);
      return 0;
    }
    
    void Myfun(int x)
    {
      printf("%d
    ",x);
    }

    这个MyFun函数是一个无返回值的函数,他并不完成什么事情。As we all know的用法。

    我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道MyFun函数名代表的是一个功能(或是说一段代码)。

    直到————>注意到函数指针概念时,不得不在思考:函数名到底又是什么东西?

    (不要以为这没有什么意义的事噢!呵呵... 继续看你就知道了。)

    2. 函数指针变量的申明

    As we all know 数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也可以存储在某个函数指针变量里的。这样我就可以通过这个函数指针变量来调用所指向的函数了。

    在C系列语言中,任何一个变量,总是要先申明,之后才能使用。那么函数指针变量也应该要先申明吧?那又是如何来申明的呢?以上面例子为例,我来申明一个可以指向MyFun函数的函数指针变量FunP。下面就是申明FunP变量的方法:

    void (*FunP)(int);  //也可以写成void (*FunP)(int x);

    你看,整个函数指针变量如同函数MyFun的申明处一样,只不过——我们把MyFun改成(*FunP)而已,这样就有了一个能指向MyFun函数的指针FunP了。(当然,这个FunP指针变量也可以指向所有其他具有相同参数及返回值的函数。)

    没有代码,都是文字,累死宝宝了...

    3. 通过函数指针变量调用函数

    有了FunP指针变量后,我们就可以对它赋值指向MyFun,然后通过FunP来调用MyFun函数了。看我如何通过FunP指针变量来调用MyFun函数的:

    1 #include <stdio.h>
    2 
    3 int main(void)
    4 {
    5     
    6 return;
    7 }

    回调函数:在一处声明和调用,在其他地方实现的这样一个函数称为回调函数

    一般回调函数的用法为:

    甲方进行结构体的定义(成员中包括回调函数的指针)

    乙方定义结构体变量,并向甲方注册,

    甲方收集N个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。

    当 函数指针 作为函数的参数,传递给一个被调用函数,被调用函数就可以通过这个指针调用外部的函数,这就形成了回调

    一般的程序调用函数作用不是非常明显,可以不使用这种形式

    最主要的用途就是当函数不处在同一个文件中,比如动态库,要调用其他程序中的函数就只有采用回调的形式

    通过函数指针参数将外部函数地址传入来实现调用

    函数的代码做了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级。

  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/6150092.html
Copyright © 2011-2022 走看看