一、复杂声明的右左原则:主要是根据符号的优先级原则,然后()能改变优先级的特性来总结出来的一个原则。
遇到下面的标识的读法:
*: 指针,指向
[]:数组,元素为
():函数,返回
1、先找到变量名,然后往右看,如果是(),表明是函数,返回什么往左看,
如果是[]表明是数组,数组元素类型是什么往左看,
2、如果往右遇到的直接是右括号),那就往标识符左看是什么,一直往左,直到遇到左括号(结束,再接着往度过的右侧看,依次重复就行。
以下的读法要按照上面的读法来进行
以下是一些例子:
1、int *a[5] : 根据运算符优先级相当于:(int *)a[5]:
解析:
1)、找到标识符a: --->a是
2)、右侧是[] --->a是一个数组
3)、数组元素是:往左看,是int *类型的
总结:a是一个数组,数组元素类型都是int *的,所有a是一个元素类型为int *的数组
2、int (*a)[5]
解析:
1)、找到标识符a--->a是
2)、往右是),直接往左是*---> a是一个指针
3)、继续往左直到(,结束,再往(*a)的右边是[]--->指针指向数组。
4)、再往左侧是int--->,数组的元素是Int类型,
总结:a是一个指向元素类型为int的数组的指针。
3、int (*a)(int)
解析:
1)、找到标识符a--->a是
2)、往右是),那就往左是*--->a是一个指针
3)、再往左是(,直接再往右,是(int),指针指向一个函数,函数参数是int。
4)、再往左是int --->函数返回值是int型的
总计:a是一个指向形参是int,返回值是int的指针。
4、int (*a[5])(int):
解析:
1)、找到标识符a--->a是
2)、往右是[]--->a是一个数组
3)、再往左,是*--->数组类型是指针类型的
4)、往左是(,再往右,是(int) --->指针指向一个函数,
5)、再往左,是int,函数返回值是int
总结:
a是一个指向元素类型为函数指针的数组,这些函数的形参是int,返回值是int,也就是
a是一个数组,数组内部元素类型是指针,指针指向函数,函数形参是int,返回值是int
5、int *(*func())():
解析
1)、找到标识符func--->func是
2)、往右是(),---->func是一个函数,
3)、往左是*,函数返回的是指针
4)、往左到了(,往右是(),这个指针指向一个函数
5)、往左,是*,函数返回值是指针
6)、继续往左,这个指针指向int
总结:func是一个返回指针的函数,返回的指针指向一个返回int *的函数
6、int (*(*fun_one)(char *,double))[9][20]:
解析:
1)、找到标识符 fun_one--->fun_one是
2)、往右是),那往左是*,--->fun_one是一个指针
3)、往左遇到(,继续往右,是(),--->指针指向一个函数
4)、往左是*,----->函数返回值是一个指针
5)、继续往左是(,往右,是[9]----->指针指向一个数组,而且是二维数组
6)、往左是int--->数组类型是int的的
总结:fun_one是一个函数,形参是char *和double,返回的是一个指向一个二维数组的指针,二维数组的数据类型为int
二、特别注意:
数组名,只不过是指向第一个元素首地址的指针,他的补偿是1, 加一会指向下一个元素的首地址
而数组【的】指针虽然是指向整个数组的首地址的,但是他的步长却是数组长度,加1,会跑到数组最后的地址加1的位置。