规则中符号:
* 读作“指向...的指针”
[] 读作“...的数组”
() 读作“返回...的函数”
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个元素的一维数组