首先将“左右法则”的原文搬出来吧:
The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

上面其实已经说得很清楚了,但是刚看这一段时,我还是有很多迷糊的地方。下面我用中文(呵呵,也只能用中文,E文太烂)来讲一讲我的理解。

从最里面开始,也就是从你的变量开始一层一层往外推。最里面那个就是主体,每外面一层都是修饰紧挨着的里面一层的。
所以,你从内向外每看完一层以后,就可以把你看完的都当作一个整体,然后紧挨着的外面这一层就是来修饰这个整体的。
下面的例子中,我上面提到的这个“整体”依次用X1,X2,X3。。。来表示,以便你能看得更清楚,不被迷惑到了。

举例说明吧:

int* a;       /* a是一个指针『*a』,这个指针指向什么?指向int型数据『int X1』。所以,a是一个指向int型数据的指针。*/

int (*a)();     /* a是一个指针『*a』,这个指针指向什么?指向函数『X1()』。这是一个什么样的函数?一个没有参数,返回值为int型的函数『int X1()』。
 所以,a是一个指针,这个指针指向没有参数,返回值为int型的函数*/

int *(a[10]);    /* a是一个有10个元素的数组『a[10]』,数组的元素是什么?这个数组里的元素是指针『*X1』。这个指针指向什么?指向int型数据『int X2』。
所以,a是一个数组,这个数组含有十个元素,每个元素都是指向int型数据的指针*/

int (*a)[10];    /* a是一个指针『*a』,这个指针指向什么?指向有十个元素的数组『X1[10]』。数组的元素是什么?int型数据『int X2』。
所以,a是一个指针,这个指针指向含有十个int型数据的数组。*/

int (*((*a)[10]))(int) /* a是一个指针『*a』,什么样的指针?指向有十个元素的数组的指针『X1[10]』。数组的元素是什么?这个数组的元素是指针『*X2』。指针指向什么?指向函数『X3(int)』。什么样的函数?有一个int型参数,返回值为int型的函数『int X3(int)』。
所以,a是一个指针,这个指针指向有十个元素的数组,每一个元素都是指向"有一个int型参数,返回值为int的函数"的指针。*/

int (*(a[10]))(int (*)()); /* a是一个有十个元素的数组『a[10]』。数组的元素是什么?指针『*X1』。指针指向什么?函数『X2(...)』。什么样的函数?有一个参数,返回值为int的函数。对这个参数分析:这个参数是一个指针『(*)』。指针指向什么?指向函数『Y1()』。什么样的函数?没有参数,返回值为int的函数『int Y1()』。
所以,a是一个有十个元素的数组,数组的元素是指向函数的指针,这些函数的参数为指针,返回值为int。参数的指针是指向"没有参数,返回值为int型的函数"的指针。*/

呵呵,晕了吧?我觉得把握住左右法则的要点,按我的理解就是上面提到的:
“从最里面开始,也就是从你的变量开始一层一层往外推。最里面那个就是主体,每外面一层都是修饰紧挨着的里面一层的。
所以,你从内向外每看完一层以后,就可以把你看完的都当作一个整体,然后紧挨着的外面这一层就是来修饰这个整体的。”
百变不离其宗,无论有多复杂,用左右法则层层拨茧抽丝,就可以化繁为简。

上面我的例子中用括号比较多,有些括号还是“多余”的,因为我实在懒得去记C中繁多的优先级与结合性,用括号表示一目了然,也便于别人阅读我的代码。呵呵,我也顺便提醒一下大家,记清这些优先级不错,但是出来卖弄就不对了:)

函数指针我在大学的时候只是听说过,当时不屑一顾,认为这没什么作用,直接调用函数不就可以了?何必那么麻烦?。但是工作以后发现,函数指针实在太有用了。比如说,如果你想在C中秀一秀你的面向对象的技术,那么你可以在用struct来代替class,在struct中用函数指针来代替成员函数。当然函数指针还有许多的用处,呵呵,我才疏学浅,希望以后能深入学习一下写一点这方面的体会。网上有很多资料,很快可以搜索到,你也不必等我的那篇还不知道会不会写的文章到白头:)

好了,咱们继续,现在我们把顺序倒一倒,看看如何用左右法则来根据自己的需要写出确切的申明。

1,一个指向int型数据的指针。
这个so easy: int* a;
但是我要说明一下步骤,因为下面的繁的例子和这个的原理是一样的。
首先抓住要点:这是一个指针,于是我们可以写下 *a。
然后这个指针时指向int型数据,也就是int X1。
然后用 *a替换X1,就变成了 int (*a);
这里因为比较简单,可以去掉括号,变成 int* a;

2,一个有十个指向没有参数返回值为int型的函数的指针的元素的数组。
首先,这是一个数组,有十个元素,我们可以写下:a[10];
去掉对数组的描述,上面的这段话就变成:
“指向没有参数返回值为int型的函数的指针”
我们只抓最外一层:指针。于是变成了:*(a[10])。
去掉对指针的描述,这段话就变成:
“没有参数返回值为int型的函数”
呵呵,这个函数就是 int x();
我们把x用上面的*(a[10])来替代,就变成了:

int (*(a[10]))();

http://hi.baidu.com/himalaya/blog/item/8e262b348599533b5bb5f56b.html

左右法则 来解析指针问题相关推荐

  1. 【C/C++和指针】深度解析---指针与数组 【精华】

    一,引例子 二维数组可以使用指向数组的指针代替,而指针数组才可以用指向指针的指针代替. [html] view plaincopy #include<iostream> using nam ...

  2. java 高内聚低耦合_高内聚低耦合法则实例解析

    定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越来越密切,耦合度越来越大,当一个类发生改变时,对另外一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触到 ...

  3. Swift之深入解析“指针”的使用和实现

    一.指针 ① 指针类型 Swift 中的指针分为两类: typed pointer 指定数据类型指针,即 UnsafePointer,其中 T 表示泛型: raw pointer 未指定数据类型的指针 ...

  4. 【C语言】全面解析指针,指针知识点整理

    目录 前言: 1.指针的概念 2.指针的类型 3.野指针 3.1野指针的成因: 3.2如何避免野指针? 4.指针的运算 5.指针和数组 6.二级指针 7.指针数组 总结: 前言: 对C语言来说,指针是 ...

  5. 星际战甲堕落轰击者结合目标_星际战甲复仇法则图文攻略 复仇法则任务解析...

    三.业报任务第二阶段 然后就进入了第二小阶段,如下图: 没错,你没有看错,他们又开始踩点了,在这一阶段,一共需要度过2个大房间,2个小房间,最后到达一个不大不小的终点露天房间. 顺序分别是: 小-大- ...

  6. C语言——指针详细讲解

    目录 一.指针 二.字符指针 三.指针数组 四.数组指针 五.数组参数.指针参数 六.函数指针 七.函数指针数组 八 .指向函数指针数组的指针 九.回调函数 十.深度解析指针和数组 一.指针 (一). ...

  7. C语言指针详解(新手入门推荐)

    目录 指针的理解 字符指针:char * 无类型指针void * 指针数组 数组指针 函数指针 回调函数 函数指针数组 练习 指针和数组笔试题解析 指针的理解 关于指针,我先讲一个故事:一个侦探在案发 ...

  8. 指针难点——数组指针、指针数组、函数指针、指针函数详解

    指针难点 1.指针 1.1指针数组和数组指针 2.右左法则 3.函数指针和指针函数 示例1 示例2 示例3(面试题) 1.指针 1.1指针数组和数组指针 指针数组是一个数组,数组里面存放的内容是指针 ...

  9. C语言复习----------指针

    文章目录 一. 基本介绍: 1.1 内存: 举个例子: 1.2 指针: 1.3 指针的意义 二. 指针初阶: 2.1 野指针: 2.1.1 成因: 2.1.2 在一定程度上避免野指针的出现: 2.2 ...

最新文章

  1. 最新大脑图谱研究表明,手部的运动区域也与整个身体相连
  2. Nginx中ngx_http_upstream_module模块
  3. 搭建基于飞桨的OCR工具库,总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别的PaddleOCR
  4. [转载] Python中TFTP的理解
  5. 数组的降序排序 java
  6. win10 Java JDK环境变量配置
  7. IDEA报错: Port already in use: 2100
  8. 线性回归的从零开始实现-08-p3
  9. CDays–5 习题二(利用Python科学计算特性,使用常用计算符)及相关内容解析。...
  10. 推荐三个实用的开源项目
  11. 操作系统总结之 输入输出系统(下)
  12. 记录一次使用Aliyun OSS 存图片
  13. 自己动手做个智能小车(2)
  14. R语言开放数据分析报告
  15. 鸿蒙芯片是华为公司靠几年造出来的,难度不输芯片制造,华为高管实话实说,造出操作系统只是开始...
  16. NVIDIA JETSON NANO三个版本核心的对比
  17. 手动挡你会开吗 八招教你开好手动挡车型
  18. python网络编程案例—五子棋游戏
  19. ElasticSearch学习2_Java version:1.7.0_51 suffers from critical bug及ES对JDK版本要求
  20. WIN10 设置或取消自动关机

热门文章

  1. “+=”和append的区别
  2. CSS文件的三种引入方式
  3. 北京可以备案什么域名
  4. PHP 程序员的技术成长规划
  5. CentOS系统根目录下各个目录存放的内容
  6. 从学校到职场的路有多远
  7. 修改树状控件TreeCtrl的节点名称
  8. SpringBoot集成ActiveMq消息队列实现即时和延迟处理
  9. zabbix-通过自动注册自动添加主机
  10. Jmeter_模板设置默认请求参数