C/C++知识点之回调函数
小标 2018-08-10 来源 : 阅读 1062 评论 0

摘要:本文主要向大家介绍了C/C++知识点之回调函数,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之回调函数,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

在讨论回调函数前我们先看一下一下两种情景。

  1、你在敲代码,中午了,于是你去炒菜,然后敲代码。

  2、你在敲代码,中午了,于是你去炒菜,然后打了个电话给美团,点了份外卖,继续敲代码。

  从代码的角度看,1就是我们平时的功能函数的调用,2是调用回调函数。

  可以看出回调函数一个非常重要的好处就是你的程序变成异步了。也就是你不必再调用这个函数的时候一直等待这个时间的到达、事件的发生或中断的发生(万一一直不发生,你的程序会怎么样?),

再此期间你可以做做别的事情,或者四处逛逛。当回调函数被执行时,你的程序重新得到执行的机会,此时你可以继续做必要的事情了。

  回调函数是一个不被设计者直接调用,而是被其他人回过来调用的函数。

  回调是一种非常重要的机制,主要用来实现软件的分层设计,使得不同软件模块的开发者的工作进度可以独立出来,不受时空的限制,需要是通过约定好的接口(或标准)相互契合在一起。

  如何可以实现回调机制:

1 void func (void (*p)(void *),void * arg);
   例子:

复制代码
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void my1(void * arg)
 5 {
 6     char * str = (char *)arg;
 7     printf("%s\n",str);
 8 }
 9 
10 void my2(void * arg)
11 {
12     char * str = (char *)arg;
13     printf("%d\n",strlen(str));
14 }
15 
16 void func(void (*f)(void *), void *p)
17 {
18     f(p);
19 }
20 
21 int main(int argc, char const *argv[])
22 {
23     
24     char * msg = "hello";
25     func(my1,(void *)msg);
26     func(my2,(void *)msg);
27 
28     return 0;
29 }
复制代码
  运行结果: 

1 hello
2 5
 

  我们并没有直接调用my1和my2这两个函数,而是通过func这个中介来调用他们。

  当然,回调函数也是可以带回返回值的。

1 void * func (void * (*p)(void *),void * arg);
  例子:

复制代码
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void * my1(void * arg)
 5 {
 6     char * str = (char *)arg;
 7     printf("%s\n",str);
 8     return (void *)"my1";
 9 }
10 
11 void * my2(void * arg)
12 {
13     char * str = (char *)arg;
14     printf("%d\n",strlen(str));
15     return (void *)"my2";
16 }
17 
18 void * func(void *(*f)(void *), void *p)
19 {
20     return f(p);
21 }
22 
23 int main(int argc, char const *argv[])
24 {
25     
26     char * msg = "hello";
27     printf("%s\n",func(my1,(void *)msg));
28     printf("%s\n",func(my2,(void *)msg));
29 
30     return 0;
31 }
复制代码
  运行结果:

1 hello
2 my1
3 5
4 my2
   这两种模型都有个共同的特点,含有两类参数,一类是函数指针,另一类是传给回调函数的参数。其中函数指针是必须知道的,只有知道你想要回调的函数才能够调用它。如果回调函数不需要参数则可以传入一个NULL。    

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程