今天跟一个朋友聊到函数指针的问题,发现其实很多人不懂得如何解读一个函数指针的声明。其实有一个非常好用的法则,但我观察到很多视频或者文章里并没有提到,只是单纯告诉你他举的例子如何解读,换一个例子又不知道了。我给我那朋友解释完,他直惊呼“卧槽”,所以想分享出来,希望可以帮助到那个同样困惑的你。

我才发现B站不支持Markdown,没法插入代码块,只能贴图了:(
首先从简单的例子讲起,你至少需要知道这是一个函数指针:

整个声明有三个部分,fp是我们给它的名字,左边那个“*”说明它是一个指针,右边(int)是接受的参数类型,前面void是返回类型。你肯定想,

但是这个呢?

很多人即使大概能看懂,也没法自信的说就是这样,更没法给别人解释了。其实知道规则以后,会非常易读。我管这个规则叫右摇左摆法则,非常滑稽的名字,bear with me,但实际使用就是从中间看起,然后看它的右边,再看它的左边,再看右边,再看左边,直到结束。

所以上面这个例子,我们从fp1也就是中间开始看,

看中间,fp1,fp1是一个什么呢?

看右边,右边什么也没有,遇到括号表示告一段落。

看左边,是一个*,也就是pointer,所以fp1是一个指针,是什么样的指针呢?

看右边,(int),是一个接受一个int为参数的函数指针。

看左边,是一个*,也就是返回值是一个指针,是一个什么样的指针呢?

看右边,是[10],也就是返回一个指针指向一个数组,这个数组包含10个,10个什么呢?

看左边,是void*,哦,原来是包含10个void*的数组。

that's it! 用英文更好理解,因为英文的从句可以让上面这么多步连成一整句话。

(middle) fp1 is → (right, nothing) → (left) a pointer to → (right) a function that takes an int → (left) and returns a pointer to → (right) an array of 10 → (left) void pointers.

连起来就是:fp1 is a pointer to a function that takes an int and returns a pointer to an array of 10 void pointers.

是不是超简单?这个方法我其实是从Thinking in C++, Volume 1学到的,然后自己总结了下,并取了个沙雕但是个人认为有助于理解的名字,不懂为什么其他教程都没有这样教,再来一个:

f is a pointer to a function, that takes in an int* and a function pointer, which takes in two int* and returns an int*, and returns an int*.

用中文就是f是一个函数指针,接受一个int*和另一个函数指针作为参数,返回一个int*,它接受的那个函数指针参数呢,是一个接受两个int*作为参数,返回一个int*的函数指针。

说实话,我觉得解读函数指针的问题已经水落石出了,没法解释的更清楚了,再复杂也能按照这个逻辑去理解。当然,还有什么问题欢迎留言。

换一种思路看function pointers指针函数)相关推荐

  1. iOS换一种思路写一个无限轮播的滚动视图

    换一种思路写一个无限轮播的滚动视图 写这篇博客已经距离我当时写差不多有一个月时间了,也完善了很多,基本是没有bug的,如果有,不妨留言,喜欢的话,劳烦各位点个赞,不喜欢的,不妨看看思路,提提意见 1. ...

  2. 【PS功能学习】12:让我们换一种颜色看世界(调色一)

    第12节:让我们换一种颜色看世界(调色一) 本节学习目标: 1.色彩模式: 模式 说明 RGB模式 光学三原色,调色运用最多的一种模式 CMYK模式 印刷使用的颜色 灰度模式 图像不包含颜色,只有黑白 ...

  3. pycharm、idea换一种思路---延长试用(无限使用30天)

    当你的pycharm试用一个月后是不是很崩溃,没钱买正版,又要拒绝盗版,很好的一个思路就是再装一个,继续试用一个月,这样的确有点麻烦,那就试试下面这个插件吧!!! 首先,下载这个文件https://d ...

  4. 换一种态度看程序员(转)

    有这样一群人,他们经常孤独地工作到深夜,漆黑夜里的显示器成为房间中唯一的光源,手边残留着比萨饼和碳酸饮料.繁重的编码任务让他们很少离开座位,即便是周五的深夜,这些人依旧在办公室中奋战. 乍一听,这像是 ...

  5. 她从城市回到农村创业,后来有自己的林地,只是换了一种思路?

    下岗后不服输的么学红,不甘心闲在家中无所事事,决心靠创业改变命运.她做过服装生意,还摆过摊卖过菜--但是几年闯下来,她始终也没有找到一条成功的道路. 么学红想,树挪死,人挪活,我就不信没有自己的路!换 ...

  6. 另一种思路比较2个日期是否相等的方式

    我们在应用中经常会遇到2个日期比较是否同一年,或者同一个月或者同一日,等. 常规方式,我们通过逐个年,月,日的比较,才能确定是否是同一年,或同一个月或同一日. 我们换一种思路,把2个日期按同一个日期格 ...

  7. PHP 两个多维数组根据某个键的值进行组合排序的几种思路

    需求: 有两个多维数组 $arr = [['name'=>'dee','age'=>28],['name'=>'emperor', 'age'=>30],['name'=> ...

  8. 成员函数指针与高性能的C++委托 (Member Function Pointers and the Fastest Possible C++ Delegates)...

    标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托(delegate)")在一些 ...

  9. 求两个链表的第一个公共结点各种情况及三种思路分析

    转自:http://blog.csdn.net/ssopp24/article/details/72377184 1.寻找两个链表的第一个公共结//这道题可以有很多种思路, 我们按照, 有坏到好的顺序 ...

最新文章

  1. IIS6配置Asp.net MVC运行环境
  2. html 下拉框字体,怎么把select下拉菜单里的文字设置成左右滚动效果
  3. Docker cAdvisor安装
  4. 查看你某条sql是哪个用户执行的_django_debug_toolbar:查看访问某个页面执行sql的详细...
  5. angularjs的基础知识
  6. d3 v5 api shape.line
  7. 用HTML5制作简单的个人简历
  8. 基于Sobel算法的边缘检测简介
  9. Oracle 多行显示在一行详解(listagg)
  10. 处理 “回扣”的4种对策
  11. YNOI板刷计划记录
  12. 优质数据平台如何打造?从网易云音乐看内容生态的运营法则
  13. 计算机毕业设计jsp宠物美容网站
  14. [ArcGIS] 中文经纬度标注如何替换成英文的字母标注
  15. Virtuoso: 最全安装(IC618,IC617等), 问题解决
  16. fiddler安卓模拟器与ios手机抓包
  17. Android关联文件类型,使得自己app支持打开【加入到“用其它应用打开”的列表中】
  18. 洛谷P1386座位安排
  19. JustLaws 法律文库贡献指南
  20. 【ECshop错误集锦】解决ECShop发送邮件提示:Error: need RCPT command

热门文章

  1. 布施的功德_布施是最大的功德
  2. php source insight语言文件,玩转SourceInsight语言定义——让你的sourceinsight
  3. php跳转代码循环,PHP页面跳转代码几种方法
  4. 弱符号实现 iOS 组件化解耦
  5. Beta阶段——第6篇 Scrum 冲刺博客
  6. UI设计面试这样准备,更容易拿下心仪Offer!
  7. 同事给介绍了这款图文转换成word文档,超好用!
  8. CMMI外传--需求之九阴真经(2011版)
  9. 免费网站功能图标_您应该收藏20个免费的多功能图标集
  10. abstract类和abstract方法