摘要:本文主要向大家介绍了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+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号