左右法则

左右法则

左右法则在我们学习语言的时候非常重要,我们只有弄清楚变量的类型才能根据变量的范围定义。

 

The right-left rule: Start reading thedeclaration from the innermost parentheses, go right, and then go left. Whenyou encounter parentheses, the direction should be reversed. Once everything inthe parentheses has been parsed, jump out of it. Continue till the wholedeclaration has been parsed. 

 

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

 

对上述“右左法则”做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变量名开始,而不是从最内部的括号。 

 

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

 

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

fp1是一个函数指针,该函数的形参为整形变量,返回值为数组指针,该指针指向一个整型指针数组

 

阅读步骤: 

1. 从变量名开始 -------------------------------------------- fp1 

2. 往右看,什么也没有,碰到了),因此往左看,碰到一个*------ 一个指针 

3. 跳出括号,碰到了(int) ----------------------------------- 一个带一个int参数的函数 

4. 向左看,发现一个* --------------------------------------- (函数)返回一个指针 

5. 跳出括号,向右看,碰到[10] ------------------------------ 一个10元素的数组 

6. 向左看,发现一个* --------------------------------------- 指针 

7. 向左看,发现int ----------------------------------------- int类型 

 

 

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

 

 

再来看一个例子: 

 

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

arr是函数指针数组,该数组里面的元素指向一个形参为空,返回值为函数,该函数指向一个形参为空,返回值为整形指针的函数

阅读步骤: 

1. 从变量名开始 -------------------------------------------- arr 

2. 往右看,发现是一个数组 ---------------------------------- 一个5元素的数组 

3. 向左看,发现一个* --------------------------------------- 指针 

4. 跳出括号,向右看,发现() -------------------------------- 不带参数的函数 

5. 向左看,碰到* ------------------------------------------- (函数)返回一个指针 

6. 跳出括号,向右发现() ------------------------------------ 不带参数的函数 

7. 向左,发现* --------------------------------------------- (函数)返回一个指针 

8. 继续向左,发现int --------------------------------------- int类型 

 

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

 

 

还有更多的例子: 

 

float ( * ( *b()) [] )();      

b是函数,它的形参为空,返回值为数组指针,该指针指向一个函数指针数组,该指针数组指向一个形参为空,返回值为浮点型的函数   

 

void * ( *c) ( char, int (*)());       

c是函数指针,该函数的形参为字符型和函数指针,返回值为void*

 

void ** (*d) (int &,  char **(*)(char *, char **));  

d是函数指针,该函数的形参为整型和形参为字符型指针(和指向字符型指针的指针,返回值为指向字符型指针的指针的函数指针),返回值为void**

                           

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

e是函数指针数组,该数组保存的元素是形参为整形变量,返回值为数组指针,该指针指向           

个数为5的浮点型数组


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值