C语言中的回调函数调用过程以及函数指针使用
回调函数比喻:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。
在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。
回调函数使用是必要的,在我们想通过一个统一接口实现不同的内容,这时用回掉函数非常合适。
比如,我们为几个不同的设备分别写了不同的显示函数:
void TVshow(); void ComputerShow(); void NoteBookShow()...等等。
这是我们想用一个统一的显示函数,我们这时就可以用回掉函数了。void show(void (*ptr)()); 使用时根据所传入的参数不同而调用不同的回调函数。
不同的编程语言可能有不同的语法,下面举一个c语言中回调函数的例子, 其中一个回调函数不带参数,另一个回调函数带参数。
// Test.c
#include <stdlib.h>
#include <stdio.h>
int Test1()
{
int i;
for (i=0; i<30; i++) {
printf("The %dth charactor is:%c\n", i, (char)('a'+i%26));
}
return 0;
}
int Test2( int num)
{
int i;
for (i=0; i< num; i++) {
printf("The %dth charactor is:%c\n", i, (char)('a'+i%26));
}
return 0;
}
void Caller1( int (*ptr)() ) //指向函数的指针作函数参数
{
(*ptr)();
}
void Caller2(int n, int (*ptr)(int) ) //指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的,
{ //不能写成void Caller2(int (*ptr)(int n)),这样的定义语法错误。
(*ptr)(n);
}
int main()
{
printf("***************************\n");
Caller1(Test1); //相当于调用Test1();
printf("&&&&&&&**********************\n");
Caller2(5, Test2);//相当于调用Test2(5);
return 0;
}
以上通过将回调函数的地址传给调用者从而实现调用,但是需要注意的是带参回调函数的用法。
要实现回调,必须首先定义函数指针。函数指针的定义这里稍 微提一下。比如:
int (*ptr)();
这里ptr是一个函数指针,其中(*ptr)的括号不能省略,因为括号的优先级高于星号,那样就成了一个返回类型为指向整型的指针类型的函数声明了。
参考链接
http://www.zhihu.com/question/19801131/answer/13005983
http://www.blogjava.net/huyi2006/articles/180169.html
C语言中的回调函数调用过程以及函数指针使用的更多相关文章
- 【转】C语言中不同的结构体类型的指针间的强制转换详解
C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
- C语言学习及应用笔记之七:C语言中的回调函数及使用方式
我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题.但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析. 1.什么是回调函数 ...
- C语言中的回调函数(Callback Function)
1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数.函数是你实现 ...
- C语言中的回调函数
C语言中通过函数指针实现回调函数(Callback Function) ====== 首先使用typedef定义回调函数类型 ====== typedef void (*event_cb_t)(co ...
- C语言中的声明解析规则——数组,指针与函数
摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...
- C语言中可变参数的原理——printf()函数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 使用过C语言的人所再熟悉不过 ...
- c语言中的部分字符串和字符函数
// // main.c // homeWork1230 // // #include <stdio.h> #include <string.h> #include <c ...
- C/C++回调方式系列之一 函数指针和函数回调模式
一.函数指针 1. 函数的定义 return_type function_name(parameter list) { function_body } return_type: 返回值,函数一定有返回 ...
- 002_解析go语言中的回调函数
回调函数是一种特殊的函数写法,在很多场景中发挥广泛的作用.但是对于初学者来说,回调函数是比较头疼的一个东西,不太好懂,笔者研究了一番,以网上的一个例子详细说明一下 首先看一个代码示例(来源于网上) p ...
随机推荐
- 【GoLang】深入理解slice len cap什么算法? 参数传递有啥蹊跷?
先上结论 .内置append函数在现有数组的长度 < 时 cap 增长是翻倍的,再往上的增长率则是 1.25,至于为何后面会说. .Go语言中channel,slice,map这三种类型的实现机 ...
- ODATA 云驱动 http://www.cdata.com/cloud/
ODATA 云驱动 http://www.cdata.com/cloud/ 目前支持:ORACLE.MS SQL . MYSQL. -------------- rssbus ht ...
- Failed to issue method call: Unit httpd.service failed to load: No such file or directory.
centos7修改httpd.service后运行systemctl restart httpd.service提示 Failed to issue method call: Unit httpd.s ...
- 多字段 java对象排序
public class ReflexUtil { static Logger logger = LoggerFactory.getLogger(ReflexUtil.class); //getMet ...
- solr单机环境配置并包含外部单机zookeeper
首先和之前一样下载solr-5.3.1.tgz,然后执行下面命令释放文件并放置在/usr/目录下: $ .tgz $ /usr/ $ cd /usr/solr- 这个时候先不用启动solr,因为单机模 ...
- winrt反射
第一步引用扩展类. using System.Reflection.IntrospectionExtensions; 第二步反射. gridView是我定义的GridView控件.ItemClick是 ...
- 打包文件 MANIFEST.MF 功能详解
最近研究了如何在java工程打包,期间遇到的一些问题进行总结,如打包成test.jar 文件 Manifest-Version: 1.0 Main-Class: windows.VideoWindow ...
- 【leetcode】Max Points on a Line(hard)☆
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- 【leetcode】Happy Number(easy)
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- php数据访问增删查
1.先做一个登陆界面 <form action="chuli.php" method="post"> <div>用户名:<inpu ...