右左法则

来源:互联网 发布:雪梨开的淘宝店 编辑:程序博客网 时间:2024/04/28 06:29


规则中符号: 
 *  读作“指向...的指针”   
 []   读作“...的数组”   
 ()  读作“返回...的函数” 
1. 起始点 : 找到声明中的标识符,它就是你分析的起始点,读作:“$(Identifier)是...”; 
2. 看你的标识符右边:

 a)发现“()”,这是一个函数声明,这时你可以说“是返回...的函数”; 
 b)发现“[]”,这是一个数组声明,这时你可以说“是...的数组”; 
 c) 继续向右,直到遇到右边声明结束或者遇到“)”,继续下面。 
3. 看你的标识符左边:

如果碰到的不是我们在0.中定义的符号,则直接说出它;否则按照0.中定义的符号含义说出。继续向左,直到遇到左边声明结束或“(”。 
4. 重复2和3的步骤,直到声明分析完毕。 

 

例1详解 :int*p[]; 
1) 找到标识符:p,读作:“p是...”; 
2) 向右看:发现一“[]”,然后遇到右边声明结尾,读作:“p是...的数组”; 
3) 向左看:发现一“*”, 读作:“p是指向...的指针的数组”; 
4) 继续向左看:没有发现0.中定义的符号,则分析结束,读作:“p是指向int类型的指针的数组”。

 
例2详解 :int *(*func())(); 
1) 找到标识符:func,读作:“func是...”; 
2) 向右看:发现一“()”,然后遇到“)”,读作:“func是返回...的函数”; 
3) 向左看:发现一“*”,然后遇到“(”,读作:“func是返回指向...的指针的函数”; 
4) 向右看:发现一“()”,然后右边声明结束,读作:“func是返回指向返回...的函数的指针的函数”; 
5) 向左看:发现一“*”,读作:“func是返回指向返回指向...的指针的函数的指针的函数”; 
6) 向左看:没有发现.中定义的符号,则分析结束,读作:“func是返回指向返回指向int类型的指针的函数的指针的函数”。 

例3详解 :char(*a())[8]; 
1.找到标识符a: a是... 
2.right 发现(),然后遇到“)”: a是返回...的函数 
3.left 发现*,然后遇到“(”: a是返回指向...的指针的函数 
4.right 发现[8]而且右边已结束: a是返回指向8个...元素的数组的指针的函数 
5.left 没有发现.中定义的符号 : a是返回指向8个char类型元素的数组的指针的函数

 

例4详解 :
char *a[10]和char(*a)[10]的区别。

char *a[10]:  a先与[10]结合,是一个数组,然后与*结合,说明这个数组里面的元素是指针类型 
char (*a)[10]: a先与*结合,说明是一个指针,然后与[10]结合,说明这个指针指向的是一个具有10个元素的一维数组