运算符的优先级
从高到低为:[] () . -> ++ – * &
*p++ //指针变量先自增,然后通过*间接访问取值
&p++ //指针变量的地址自增运算
&stu.a //结构体成员变量a的地址
int *a[10]; //定义一个指针数组,数组元素类型为int*
int (*a)[10]; //定义一个数组指针,指向数组类型int a[10]
int *f(int); //定义一个指针函数,返回值类型为int*
int (*f)(int); // 定义一个函数指针,指向函数类型int f(int)
int *(*f)[10]; //定义一个数组指针,指向数组类型int *a[10]
对于复杂的指针生命可以使用"左右法则"来分析:
首先从最里面的圆括号(未定义标识符)看起,先往右看,再往左看,每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里所有的东西,就跳出圆括号。重复这个过程,直到整个声明解析完毕。
例如
int *(*(*f)(int))[10];
按照左右法则,首先从最里面的圆括号看起,f是一个指针,整个指针表达式因此也就定了性。这条语句声明的是一个指针。然后往右看,是一个参数列表,说明该指针的类型是一个函数指针。再向左看,是一个符号,说明该指针指向的函数的返回值是一个指针。此时括号里的东西解析完毕,跳出圆括号,继续重复这个过程。往右看是一个数组,再往左看是int*,与下面类似。
int *(*p)[10]
我们简化分析,p相当于定义了一个数组指针,该指针指向的数组的元素类型为int*,即p指向一个指针数组。我们把以上分析综合就可以得出最后的分析结果:这个复杂的指针声明(f)相当于定义一个函数指针,该指针指向一个函数,这个函数的类型形参为(int),返回值是一个指向指针数组的指针,指针数组中的元素类型为int。