回调函数是高阶函数吗(回调函数是什么)
您好,今天帅帅来为大家解答以上的问题。回调函数是高阶函数吗,回调函数是什么相信很多小伙伴还不知道,现在让我们一起来看看吧!
1、回调函数 程序员常常需要实现回调。
2、本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。
3、注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。
4、声明函数指针 回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。
5、要实现回调,必须首先定义函数指针。
6、尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。
7、请看下面的例子:void f();// 函数原型上面的语句声明了一个函数,没有输入参数并返回void。
8、那么函数指针的声明方法如下:void (*) (); 让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。
9、另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。
10、注意本例中还没有创建指针变量-只是声明了变量类型。
11、目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:// 获得函数指针的大小unsigned psize = sizeof (void (*) ()); // 为函数指针声明类型定义typedef void (*pfv) ();pfv是一个函数指针,它指向的函数没有输入参数,返回类行为void。
12、使用这个类型定义名可以隐藏复杂的函数指针语法。
13、指针变量应该有一个变量名:void (*p) (); //p是指向某函数的指针 p是指向某函数的指针,该函数无输入参数,返回值的类型为void。
14、左边圆括弧里星号后的就是指针变量名。
15、有了指针变量便可以赋值,值的内容是署名匹配的函数名和返回类型。
16、例如:void func() {/* do something */} p = func; p的赋值可以不同,但一定要是函数的地址,并且署名和返回类型相同。
17、传递回调函数的地址给调用者 现在可以将p传递给另一个函数(调用者)- caller(),它将调用p指向的函数,而此函数名是未知的:void caller(void(*ptr)()){ptr(); /* 调用ptr指向的函数 */ }void func();int main(){p = func; caller(p); /* 传递函数地址到调用者 */} 如果赋了不同的值给p(不同函数地址),那么调用者将调用不同地址的函数。
18、赋值可以发生在运行时,这样使你能实现动态绑定。
19、调用规范 到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。
20、许多编译器有几种调用规范。
21、如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。
22、C++ Builder也支持_fastcall调用规范。
23、调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。
24、 将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。
25、例如:// 被调用函数是以int为参数,以int为返回值__stdcall int callee(int); // 调用函数以函数指针为参数void caller( __cdecl int(*ptr)(int)); // 在p中企图存储被调用函数地址的非法操作__cdecl int(*p)(int) = callee; // 出错 指针p和callee()的类型不兼容,因为它们有不同的调用规范。
26、因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。
本文就为大家分享到这里,希望小伙伴们会喜欢。
免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!
-
亚马逊的气候友好承诺认证(Climate Pledge Friendly),俗称绿标认证,是平台对环保产品的权威认可。获得...浏览全文>>
-
亚马逊气候承诺友好认证(Climate Pledge Friendly)是平台为响应全球减碳趋势推出的战略性计划,旨在通过绿色...浏览全文>>
-
截至2024年,大众探岳GTE的售价可能会因地区、配置和促销活动而有所不同。一般来说,2024款探岳GTE的价格可能...浏览全文>>
-
关于2025款途观L的价格信息,目前还没有官方发布。不过,根据以往的市场规律和车型更新周期,我们可以大致推测...浏览全文>>
-
根据您提供的信息,2024款广东东莞威然的最低售价为22 99万元起。关于具体的落地价,需要考虑以下因素:1 ...浏览全文>>
-
根据您的描述,生活家PHEV 2025款的最低售价为 63 98万元起。如果目前有促销活动或优惠政策,建议尽快咨询...浏览全文>>
-
奔腾T99作为一汽奔腾旗下的旗舰SUV车型,凭借其大气的外观设计、丰富的科技配置以及出色的性能表现,吸引了众...浏览全文>>
-
当然可以!以下是一个简单的试驾预约流程,帮助您轻松开启智蓝G5新能源的试驾之旅:1 确定需求- 车型选择...浏览全文>>
-
特斯拉的赛博越野旅行车(Cybertruck)自发布以来就引发了广泛关注。这款车型结合了皮卡的实用性、SUV的多功能...浏览全文>>
-
江淮悍途EV是一款纯电动皮卡,如果您想预约试驾,通常需要满足以下条件和准备以下信息:1 基本条件 - 年...浏览全文>>
- 山东济南途观L新能源价格大公开,买车不花冤枉钱
- 东莞途岳最新价格2025款全分析,买车不踩坑
- 济南探岳GTE新车报价2024款,换代前的购车良机,不容错过
- 郑州ID.7 VIZZION多少钱 2024款落地价,配置升级,值不值得买?
- 郑州途锐新能源最新价格2024款,优惠购车,最低售价67.98万起
- 瑞虎7 PLUS新车报价2025款,买车前的全方位指南
- 广东东莞揽巡价格走势,市场优惠力度持续加大
- 轩逸新车报价2025款,买车前的全方位指南
- 飞凡R7新车报价2025款,换代前的购车良机,不容错过
- 试驾风光ix5,轻松搞定试驾
- 捷途山海L7预约试驾,从预约到试驾的完美旅程
- 试驾E福顺,从预约到试驾的完美旅程
- 长安星卡EV多少钱?选车指南与落地价全解析
- 凯翼E5 EV多少钱?如何挑选性价比高的车
- 标致408X预约试驾,快速操作,轻松体验驾驶乐趣
- 试驾星际牛魔王,新手必看的操作流程
- 岚图汽车岚图梦想家试驾预约,轻松几步,畅享豪华驾乘
- 影豹多少钱?全方位对比助你选车
- 豪运最新价格2023款,豪华配置超值价来袭
- 缤智多少钱 2025款落地价全解买车必看