打印

【转】C语言笔记:C语言的左右法则

[复制链接]
505|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一灯大神|  楼主 | 2017-1-6 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。看起来貌似复杂没有章法,其实C语言你可以用左右法则解读复杂指针声明。

The right-left rule: Start reading the declaration fromthe innermost parentheses, Go right, and then go left. When you encounterparentheses, the direction should be reversed. Once everything in theparentheses has been parsed, jump out of it. Continue till the wholedeclaration has been parsed.

这段英文的翻译大概是:

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

我觉得要注意一点是:需要从未定义的标识符开始阅读,而不是只从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个,重点在于未定义的标识符。

下面是面试的例题,用以分析掌握左右法则:

用变量a给出下面定义:

                                  a)  一个整数(An integer)//int a;

                                  b)  一个指向整型数的指针(A pointer to an integer)//int *a;

                                  c)  一个指向指针的指针,它指向的指针是指向一个整型数(A pointer to a pointerto aninteger)//int **a;

                                  d)  一个有10个整型数的数组(An array of 10integer)//int a[10];

                                  e)  一个有10个指针的数组,该指针是指向一个整型数的(An arrayof 10 pointers to integers)//int *a[10];

                                  f)    一个指向有10个整型数组的指针(A pointer to anarray of10 integers)// int (*a)[10];

                                  g)  一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to afunctionthat takes an integer as an argument and returns an integer)//int (*a)(int);

                                  h)  一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型(An array of tenpointers to functions that take an integer argumentand return an integer)//int (*a[10])(int);

大家可以尝试一下复杂一点的声明分析:

1.int *(*(*fp1)(int))[10]; //fp1:函数指针变量,该函数指针指向一个形参为int,返回值为数组指针。该数组指针指向一个整型指针数组。

2.float(*(*b())[ ])();    //b:函数,形参为空,返回值是数组指针,该指针指向一个函数指针数组。该数组指向一个形参为空,返回值为float型的函数。

3.void *(*c)(char,int (*)());    //c:函数指针,该指针所指向的函数的形参为char型和一个函数指针,形参中的函数指针的形参为空且返回值为int型,返回值为void。

4.int *( *( *arr[5])())();    //arr:有5个函数指针的数组,指针所指的函数的形参为空,返回值是指向函数的指针,函数的形参为空,返回值为整型指针。

5.void **(*d)(int *,char **(*)(char *,char **));    //d:函数指针变量,指针所指向的函数形参为int类型的指针和一个函数指针,形参中的函数指针所指向的函数形参为char型指针和char型指针的指针,形参的返回值为char型指向指针的指针,返回值为void型指向指针的指针。

6.float (*(*e[10])(int *)) [5];    //e:有19个函数指针的数组,指针所指向的函数的形参为int型指针,返回值为有5个float型的数组指针。


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

112

帖子

2

粉丝