函数回调以及函数指针

code 其实只是行为的一种描述,code可以编码成为data,将data解释运行的时候,也会变成code。code和data可以不用区分,统一称为信息。

##统一code、data的共性(数据和代码的统一)

有些语言不单可以传递函数,函数里面又用到一些外部信息(包括code, data)。那些语言可以将函数跟函数所用到的信息一起传递存储。

这种将函数和它所用的信息作为一个整体,就为闭包。

### 闭包在swift语言中经常会用到。

### 将代码和数据打通,统一起来,是一个槛。比如一些修改自身的程序啊,数据驱动啊,先设计数据再写程序等等。

回调函数也就是是A让B做事,B做着做着,信息不够,不知道怎么做了,就再让外面处理。

C语言中不可以传进第一值的函数,就设计成传递第二值的函数指针,这个函数指针就是A传向B的信息,用来表示一个行为。这里本来A调用B的,结果B又调用了A告诉它的信息,也就叫callback。

### 回调函数和闭包之间存在着大与小范围的关系。

在分层设计中,高层次的模块会叫低层次的模块做一些事情,通常是通过函数调用。

从设计上来说,低层次的模块不应该直接调用高层次模块的函数。

### 明晰回调与调用之间的关系,回调是在调用的基础上扩展的。

操作系统本是为应用程序服务,由应用程序来调用。而应用程序一旦启动,却要反过来等待操作系统的调用。这分明也是一种回调,或者说是一种广义回调

### 广义回调例子:程序应用启动与操作系统之间的关系(存在回调)

回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制, 相对于同步执行,提高了效率.

回调函数:

回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象、全局函数等)时, 将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象。

"这个函数就是调用者和被调用者之间的一种通知约定"

,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数。 这种方式,调用者在一个线程,被调用者在另一个线程。

总结:(回调函数)被调用者之所以是以参数的形式放在调用者的函数中,因为这样就可以回调调用者的资源,是西安回调,不过他们在不同的线程中。

window上的回调函数:

回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。

在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。

### 需要注意的是回调函数必须是全局函数或者静态成员函数

声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统,不要把它当作你的某个类的成员函数。

回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适

总结:

1、先理解函数指针的概念,函数指针和变量指针的关系,函数指针是一个存放函数栈中的地址。

2、函数调研,函数调用就是一个函数准备者,被被人调用

3、函数回调,区分调用者和被调用者,调用者调用被调用这的同时,被调用者也会利用调用者的资源(或调用调用者),一般是以函数指针参数的形式传递。

4、回调函数(被调用者的函数),注意要是全局函数或者静态函数。

5、函数回调,是一种设计模式,与语言无关

6、函数回调的例子:有计算机的中断、计算机应用的启动等等。

参考链接:

回调函数:

http://blog.csdn.net/jackystudio/article/details/11720325

http://www.cppblog.com/SpringSnow/archive/2008/12/07/68770.aspx

c语言与函数指针

http://blog.jobbole.com/44639/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 00:49:03

函数回调以及函数指针的相关文章

递归、函数回调、字符的思考

1.函数指针类型做什么工作呢(起什么作用) 1)它规定了函数的"返回值和参数."只要是这种它所对应的返回值和参数类型的函数,它都可以调用起来. 2)回调函数是通过函数指针做函数参数实现的,"它的本质是:提前对函数的返回值和参数做了一个约定" 2.数组类型和数组指针指针类型 1)数组类型 int arr[10]; arr代表数组首元素地址: &arr代表整个数组首地址.虽然 arr 和 &arr 的值相同,但是他们的步长不同 2)数组类型 typede

Javascript中的回调函数和匿名函数的回调

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 匿名函数自调的意义: 1.营造了一个封闭的空间 2.防止变量冲突 3.有选择性的对外开发(第三方框架都是对js这样封装的) */ //===

再议指针---------函数回调(qsort函数原理)

我们能否写一个这样的函数: 可以对任何类型数据排序 任何人在使用该函数不需要修改该函数代码(即:用户可以不必看到函数源 码,只会调用就行) 思考: 用户需要排序的数据的类型千变万化,可能是int型,也有可能是自定义的结构体类型,各种类型的大小比较规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能. 但具体需要排序的类型应按照什么规则确定大小只有使用该函数的用户最清楚,那我们可不可以把实现比较大小的功能交给用户来完成了,到时候用户只需告诉该函数比较规则(函数)在什么位置,这样排序函数不就

委托&amp;指针函数&amp;回调函数

委托 委托是一种数据类型,像类一样(可以声明委托类型变量)方法参数可以是int string 类类型. //1 //委托小结 //1 定义一个委托需要delegate关键字 //public delegate void WriteTimeToAny(); //2 委托用来存储的方法要与定义的委托类型相一致 //3 委托是一个数据类型,用时需要传递一个变量,可以使用关键字new也可以不使用 //使用委托的意义 //主要是注入代码,写入一个委托类型方法方便以后使用时可以用实现相应的功能 //2 //

Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二部分将第一部分的示例进行扩展,展示了如何在python中调用多线程的C模块:第三部分扩展了第二部分,增加了在C模块的线程中回调python的演示. 本文所用的环境为:64位Win7 + python 3.4 x86 + vs2010 一.windows下的C语言多线程程序 windows下多线程编程

回调函数以及钩子函数的概念

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递.对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权.要实现Win32的系统钩子,必须调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,这个函数的原型是

回调函数和钩子函数

什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为 int )的被调用函数. 如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序.快速排序. shel

函数回调

回调函数:把一个函数指针作为参数给另一个函数使用. 可以选择回调函数:类型和名称,一种封装思想. 更改函数执行顺序.承诺promise,和解锁 $(function(){ // 定义函数 add var add = function(x,y){ console.log("x+y="+ (x+y)); }; // 定义函数 ce var ce = function(x,y){ console.log("x*y="+ (x*y)); } // 定义函数 use,使用参数

C++学习笔记(八):函数重载、函数指针和函数对象

函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处. 试想如果没有函数重载机制,如在C中,你必须要这样去做:为这个print函数取不同的名字,如print_int.print_string.这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型.char*.各种类型的数组等等.