`

右左法则

阅读更多

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.

这是一个简单的法则,但能让你准确理解所有的声明。这个法则运 用如下:从最内部的括号开始阅读声明,向右看,然后向左看。当你碰到一个括号时就调转阅读的方向。括号内的所有内容都分析完毕就跳出括号的范围。这样继 续,直到整个声明都被分析完毕。对上述 右左法则 做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变 量名开始,而不是从最内部的括号。

 

#include<signal.h>

void (* signal (int signo, void (*func) (int) )) (int );

 

signal 函数,阅读步骤:

  1. func 开始 -----------------------------------------------func
  2. 向右看碰到)因此向左看碰到一个 *-------------------------- 一个指针
  3. 跳出括号,碰到( int --------------------------------------------------------- 一个带一个 int 类型参数的函数
  4. 向左看, int signo ------------------------------------------------------------ 又一个 int 类型的参数
  5. 红色部分处理完跳出括号向右看遇到)向左遇到 *-------------------- signal 函数)返回一个指针
  6. 粗体部分看完了跳出向右遇到( int -------------------------------------- 一个带 int 类型参数的函数
  7. 向左看发现 void-------------------------------------------------------------------void 类型, signal 函数返回的指针指向一个参数为 int 类型,返回值为 void 类型的函数。

 

可以理解为 signal 函数的参数有两个,一个是 int 类型,一个是一个函数指针(参数类型为 int ,返回值为 void ),返回值为一个函数指针(参数类型为 int ,返回值为 void )。

因此按照书中的解释,如果使用 typedef 更好理解一些:

typedef  void SigFunc ( int );   // 声明一个类型,该类型为函数且有一个 int 参数并且返回值为 void 型。

signal 函数可以简写为:

SigFunc * signal int SigFunc* );

 

关于理解复杂的 c++ 声明,这上面的左右法则是从 http://buaadallas.blog.51cto.com/399160/80947 学来的,上面有几个更复杂的声明:

下面结合例子来演示一下 右左法则 的使用。

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

阅读步骤:
1.
从变量名开始 -------------------------------------------- fp1
2.
往右看,什么也没有,碰到了 ) ,因此往左看,碰到一个 * ------ 一个指针
3.
跳出括号,碰到了 (int) ----------------------------------- 一个带一个 int 参数的函数
4.
向左看,发现一个 * --------------------------------------- (函数)返回一个指针
5.
跳出括号,向右看,碰到 [10] ------------------------------ 一个 10 元素的数组
6.
向左看,发现一个 * --------------------------------------- 指针
7.
向左看,发现 int ----------------------------------------- int 类型


总结: fp1 被声明成为一个函数的指针 , 该函数返回指向指针数组的指针 .


再来看一个例子:

int *( *( *arr[5])())();

阅读步骤:
1.
从变量名开始 -------------------------------------------- arr
2.
往右看,发现是一个数组 ---------------------------------- 一个 5 元素的数组
3.
向左看,发现一个 * --------------------------------------- 指针
4.
跳出括号,向右看,发现 () -------------------------------- 不带参数的函数
5.
向左看,碰到 * ------------------------------------------- (函数)返回一个指针
6.
跳出括号,向右发现 () ------------------------------------ 不带参数的函数
7.
向左,发现 * --------------------------------------------- (函数)返回一个指针
8.
继续向左,发现 int --------------------------------------- int 类型

//arr is an array of 5 pointers to functions
//that take no arguments and return pointers to
//functions having no arguments and having int type as return value.

还有更多的例子:

float ( * ( *b()) [] )();     // b is a function that returns a
            // pointer to an array of pointers
            // to functions returning floats.

void * ( *c) ( char, int (*)());   // c is a pointer to a function that takes
            // two parameters:
            //   a char and a pointer to a
            //   function that takes no
            //   parameters and returns
            //   an int
            // and returns a pointer to void.

void ** (*d) (int &, char **(*)(char *, char **));   // d is a pointer to a function that takes
            // two parameters:
            //   a reference to an int and a pointer
            //   to a function that takes two parameters:
            //   a pointer to a char and a pointer
            //   to a pointer to a char
            //   and returns a pointer to a pointer
            //   to a char
            // and returns a pointer to a pointer to void

float ( * ( * e[10]) (int &) ) [5];      

            // e is an array of 10 pointers to
            // functions that take a single
            // reference to an int as an argument
            // and return pointers to
            // an array of 5 floats.

分享到:
评论

相关推荐

    C语言右左法则----复杂指针解析

    C语言右左法则----复杂指针解析 C语言中的指针声明可以非常复杂,以至于让人难以理解和解析。为了解决这个问题,右左法则被引入,以帮助开发者更好地理解和解析复杂的指针声明。右左法则是一个简单却非常实用的方法...

    超强的指针学习笔记 C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。

    复杂的指针声明有时可能会让初学者感到困惑,但通过掌握“右左法则”(Right-Left Rule),我们可以更好地理解和解析这些声明。 右左法则是一种解析C语言中复杂指针声明的方法,它不是C语言标准的一部分,而是根据...

    C语言指针的左右法制

    右左法则的英文原文是这样的: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 ...

    C语言中的左右文法和结合优先级

    右左法则是C语言中解析指针声明的重要方法,它的英文原文是:The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, ...

    C语言指针学习笔记

    右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,...

    解读C语言复杂声明.pdf

    因此,本文将详细讨论C语言中的复杂声明,包括右左法则、typedef逐步分解方法,帮助C语言的初学者准确把握复杂指针声明的解析。 一、右左法则 右左法则是一种解析复杂声明的方法,该方法可以帮助程序员快速并正确...

    C语言超强的指针学习笔记

    本篇文章将基于提供的标题、描述和部分内容,深入探讨C语言中的指针声明及其解析方法,特别是所谓的“右左法则”。 #### 指针声明与解析 首先,我们要理解C语言中的指针声明是如何构成的。通常情况下,指针声明...

    c语言强悍指针学习笔记

    本篇学习笔记将深入探讨如何理解和解析复杂的指针声明,并介绍一个非常实用的方法——“右左法则”。 #### 复杂指针声明的构成 在C语言中,所有的复杂指针声明实际上都是由基本的声明结构通过嵌套的方式组成的。...

    很好的C语言复杂指针分析

    本文将深入探讨“复杂指针”的概念,以及如何使用“右左法则”来解析和理解复杂的指针声明。 复杂指针声明通常涉及指针、数组和函数的嵌套组合,它们的解析需要遵循一定的规则。右左法则是一种流行的方法,用于理解...

    超强的指针学习笔记(注释).doc

    本文将详细讲解如何理解和应用“右左法则”来解析复杂的指针声明。 首先,我们要明确一点,C语言中的指针声明可能会非常复杂,尤其是当涉及到函数指针、指针数组以及多级指针时。右左法则提供了一个方便的技巧,...

    超强的指针学习笔记

    这里我们将深入探讨如何理解和解析复杂的指针声明,主要依据“右左法则”。 右左法则是一种帮助我们解读C语言中复杂指针声明的技巧。它要求我们从声明的最内部开始,向右移动,然后向左移动。在遇到括号时,我们...

    C和C++的复杂类型及指针声明详解.doc

    右左法则的基本原则是,从右到左读取类型声明,遇到括号时,先解析括号内的类型,然后继续从右到左读取。 C和C++语言中的复杂类型声明方式非常多样化,我们需要了解每种类型的声明语法和实践意义,以便更好地理解和...

    复杂函数申明解析

    本文将带领读者逐步解析C/C++中的复杂函数声明,包括使用typedef、const关键字以及函数指针的高级用法,并教授掌握“右左法则”,从而准确理解任何C/C++声明。 ### 基础知识 在开始解析复杂声明之前,我们需要了解...

    左手法则c语言程序

    其中,左转、右转和后退操作依据当前检测到的环境状态执行,而迷宫搜索算法则是整个程序的核心部分,负责规划小车从起点到终点的具体路径。 ### 四、总结 通过以上分析可以看出,该程序实现了基于左手法则的小车...

    C语言函数指针小结C语言函数指针小结.doc

    可以按照右左法则解读为:func是一个指针,然后跳出圆括号,右边也有个圆括号,这说明(*func)是一个函数,而func是一个指向这一类函数的指针,就是一个函数指针,这一类函数具有int*类型的形参,返回值类型是int。...

    超强的指针精讲学习笔记

    本文将详细讲解指针的概念、运算、以及与数组的关系,并通过实例应用右左法则来解析复杂的指针声明。 首先,我们要理解指针的概念。指针变量是一个特殊的变量,它存储的是另一个变量的地址,即内存单元的位置。在...

    怪异指针的识别法,多种多样的嵌套指针识别法

    本文将详细介绍一种著名的解读方法——“右左法则”,并结合具体的例子帮助读者掌握这一技巧。 #### 右左法则简介 右左法则是一种非常实用的技巧,它能够帮助我们解析复杂的嵌套指针声明。该法则的基本步骤如下: ...

    教你理解复杂的C-C++声明

    C/C++声明:我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地 理解任何C/C++声明的“右左法则”。需要强调一下的是,复杂的C/C++声明并不是好...

    电脑鼠迷宫算法

    为此,算法中引入了多种前进方向的选择法则,如右手法则、左手法则、中左法则、中右法则和乱数法则等。除此之外,算法还包括迷宫的标记、试跑、数据补全、阻断、等高表的制作以及可行路径的计算等步骤。 在迷宫的...

Global site tag (gtag.js) - Google Analytics