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个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。

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

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

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

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

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

  • 相关阅读:
    【浏览器】谷歌浏览器快捷键
    【问题】html页面不能自动更新,重启项目也不行。package时可以。
    Hibernate与mybatis的区别
    ssh的执行流畅
    ssm执行流程
    struts的上传下载
    HTML列表
    什么是HTML,HTML的简介,HTML结构
    hadoop hdfs 分布式存储
    面向对象的七大原则
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/6150092.html
Copyright © 2011-2022 走看看