一个声明:int *p[]
分为四部分:
(1)p
(2)p右面的符号(可以什么都没有)
(3)p左面的符号(可以什么都没有)
(4)最左面的类型说明符
解读一个声明先从p开始,然后的顺序是:右左右左右左右左····
看完了p,然后从p的右边开始看符号(因为优先级高的符号 [ ]和 ( ) 是放在右边的),如果有符号,就和p先结合。
看完右边的符号(如果有的话)后,就决定了p是什么,比如p右面是[],那么p就是数组,如果是(),那么p就是函数,如果什么都没有,那么p就是变量。
这时,就到p左边的符号发挥作用了(左边要么是 * ,要么就什么都没有)。
最后发挥作用是则是类型说明符(int,char,long······)。
实战演示:
int (*p)();
先看p
右面,由于有一个括号把p和*括起来,所以这个声明的最内层是(*p),所以p右面没有东西,那么p就是个变量。
左面,(*p)左面是*,所以p是一个指针变量。
右面,(*p)的右面是一个(),所以p这个指针,指向的是函数。
左面,什么都没有了。
最后是类型符,int,所以,p是一个指针变量,指向函数,函数返回值是int类型。
char (*(*x())[])();
先看x
右面,(),x是一个函数
左面,*,函数返回值类型是指针
右面,[],函数的返回值是指针,该指针指向数组
左面,*,数组内存放的数据是指针
右面,(),数组内的指针指向的是函数(函数指针)
左面,指针指向的函数的返回值是char
char (*(*x[3])())[5];
x
右面,[3],x是一个数组,数组内有三个元素
左面,*,数组内的元素是指针
右面,(),指针指向的函数
左面,*,函数的返回值类型是指针
右面,[5],指针指向的是数组,指向的数组容量是5
左面,char 数组内的元素是char类型
最后说一句,真不知道这样的声明定义出来的东西谁能看懂,我反正是不会用的。