我们初学者总是分不清形如int * (* (*fp1) (int) ) [10];的变量声明,下面就来介绍这种变量声明的理解规律:
想看懂这种变量声明,首先得学会右左法则;
就是先找到变量,再寻找变量右边的提示再看左边再右边一直循环;
注:
* 代表指针;
【】代表数组;
()代表函数;(不是所有的括号都代表函数,例如 int (*a)(int );只有第二个才是代表函数的)
int /float/double...代表变量类型;
例如:最简单的 int a;
首先找到变量a,我们先思考a的变量类型,a右边没有任何符号,所以继续看左边为int 就表明a的类型是int型;
再如: int *a;
首先找到变量a,a右边没有提示,找左边,左边是*,表示a是*类型的,也就是说a是指针变量,下一步就是对指针变量的提示了;再看右边有没有指针的提示,没有;再看左边,得到提示 int 所以指针变量所指向的是整型(int)的地址;
再如: int (*a)(int)
首先找到变量a,a右边是括号内,所以看左边是*,所以a是指针变量;再看右边,右边是括号,这是函数的声明方式,所以提示上一步所说的指针变量指向了一个函数;再看左边 int 提示该函数是整型的函数;
所以如:int (*a[10])(int )
首先找到变量a,a右边是数组的【,所以表示a是数组a,下一步找左边,得到数组的提示*,所以,数组的元素都是指针;再看右边,得到指针的提示(),提示指针指向一个函数,括号内int是函数的形参,再看左边,得到函数返回值的提示为int 型;
综上:
遇到*,则说明是上一步得到的为指针,下一步往左(右)得到的则是指针的地址说明;例如下一步看右边并且是()则说明得到的指针指向函数;
遇到[],则说明是上一步得到的为数组,下一步往左(右)得到的则是数组的元素说明;例如下一步看左边并且是 *,则说明数组元素存放的均为指针变量;
遇到(),则说明是上一步得到的为函数,下一步往左(右)得到的则是函数的返回值;例如若这步得到(int a)下一步看左边得到*,则说明函数的形参为int型,返回值为指针;
最后较复杂的例子: