在网上遇见felix,他让我读 http://www.felix021.com/blog/read.php?2072,读完之后觉得收获很大,需要练习一下。

黄金法则:从声明的变量开始,先向右看,再向左看,再向右看,再向左看 。。。

如果向右看的时候遇到),则一直向左看,直到遇到(跳出这层括号。然后再重复向右看,向左看。

举例说明:

例子1

int a;

a 的右边什么都没有,向左看int,说明a是一个int型变量。

例子2

char *a;

向右看,什么都没有; 向左看是*, 说明a是一个指针; 再向右看,什么都没有; 再向左看是char,说明a是一个指向char的指针。

例子3

int *a[];

向右看,[]说明a是一个数组;向左看,*说明数组的每个元素是个指针;再向右看,什么都没有; 再向左看,int,每个指针指向一个整数。综合来看,a是一个数组,数组每个元素指向整数。

例子4

int * const a;

向a右边看,什么都没有。一直向左看,先是const,说明a是不可修改的,然后是*,说明a是一个指针;然后是int,说明指针指向整数。综合来看,a是一个不可修改的指针,它指向整数。

例子5

void (*checkout)();

向右看,遇见)返回,再向左看是*,说明checkout是个指针。再向右看,是(),说明这个指针指向函数; 向左看是void,说明函数返回void。总的来看, checkout是一个指向返回void的函数的指针。

例子6

void (*checkout[])()

向右看,[]说明checkout是一个数组;向左看, *说明数组每个元素是个指针。向右看,遇见)返回;再向左看,遇见(返回。再向右看,是(),说明数组内每个指针指向函数; 向左看是void,说明每个函数返回void。

总的来看, checkout是一个数组,数组内都是指向返回void的函数的指针。

例子7

void (*(*checkout)[])()

向右看,遇见)返回; 向左看,*说明checkout是个指针,遇到(跳出一层()。向右看,[]说明checkout指向的是一个数组;向左看, *说明数组每个元素是个指针。向右看遇见),向左看遇见(,跳出一层()。向右看,()说明数组每个元素指向一个函数;再向左看,void说明每个数组元素指向的函数返回void。

总结:checkout是一个指针,指向一个数组,每个数组元素都是一个指向返回void函数的指针。

我了个去,有点头大了。据说c++的面向对象和多态就是靠函数指针和函数指针数组实现的。

读懂复杂C声明的黄金法则的更多相关文章

  1. 从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HT ...

  2. [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

    从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路   http://www.52im.net/thread-1709-1-2.html     本文原作者阮一峰,作者博客:r ...

  3. 一篇文章读懂JSON

    什么是json? W3C JSON定义修改版: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,并不是 ...

  4. 大数据篇:一文读懂@数据仓库(PPT文字版)

    大数据篇:一文读懂@数据仓库 1 网络词汇总结 1.1 数据中台 数据中台是聚合和治理跨域数据,将数据抽象封装成服务,提供给前台以业务价值的逻辑概念. 数据中台是一套可持续"让企业的数据用起 ...

  5. 一文读懂Redis常见对象类型的底层数据结构

    Redis是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合( ...

  6. 一文读懂Java动态代理

    作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...

  7. C#基础之IL ,轻松读懂中间代码IL 转载

    [No0000152]C#基础之IL,轻松读懂IL   先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.n ...

  8. 一文读懂数仓中的pg_stat

    摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...

  9. Java8 函数式【1】:一文读懂逆变

    Java8 函数式[1]:一文读懂逆变 禁止转载 pure function 协变 逆变 Java8 引入了函数式接口,从此方法传参可以传递函数了,有人说: 不就是传一个方法吗,语法糖! lambda ...

随机推荐

  1. 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...

  2. 解决在Mac上用pyenv安装python3失败的问题

    背景 前段时间在本地Mac系统上要跑一个python3写的压测脚本. Mac默认安装的是python2, 而且很多软件依赖的也是python2. 为了不影响现有系统其它软件, 当时安装了pyenv来实 ...

  3. xpath 去除空格

    normalize,字面意思就是正规化 加入space  大概意思就是空格的处理了 官方解释是这样的: 通过去掉前导和尾随空白并使用单个空格替换一系列空白字符,使空白标准化.如果省略了该参数,上下文节 ...

  4. linux 关机、重启

    一.重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20 ...

  5. 一张图看懂Function和Object的关系及简述instanceof运算符

    我在写一篇图解prototype和__proto__的区别时,搜资料搜到了一个有意思的现象,下面这两个运算返回的结果是一样的: Function instanceof Object;//true Ob ...

  6. 【HLSDK系列】groupinfo的基本用法

    如果你经常写AMXX,你应该会知道有个 pev->groupinfo 变量,但我猜大部分人都不会用这个变量,这个变量涉及很多实体处理功能,下面列举几个最常用的. ① 玩家与非玩家实体之间的碰撞检 ...

  7. innobackupx备份原理

    1.工具内容 该软件安装完成会有四个工具,如下所示: usr├── bin│ ├── innobackupex│ ├── xbcrypt│ ├── xbstream│ └── xtrabackup 其 ...

  8. Common Substrings POJ - 3415(长度不小于k的公共子串的个数)

    题意: 给定两个字符串A 和 B, 求长度不小于 k 的公共子串的个数(可以相同) 分两部分求和sa[i-1] > len1  sa[i] < len1  和  sa[i-1] < ...

  9. NOIP2017 游记

    没考多好......并不知道该写什么...... 那就写写流水账...... DAY 0 上午到机房,众人全是打板子or颓废的....然后我打完板子去打印了个奇怪的背包九讲.... 然后大巴到德州东, ...

  10. 【刷题】BZOJ 1537 [POI2005]Aut- The Bus

    Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个 ...