C语言中的指针

指针中相对复杂的主要有三类情况:指针数组、数组指针和函数指针,以及三者相互嵌套的情况。弄清楚C中各类符号的运算优先级才能真正理解其含义。

C语言运算符号优先级

优先级运算符结合律
1后缀运算符:[],(),.,->,++,--从左到右
2一元运算符:++,--,!,~,+,-,*,&,size_of从右到左
3类型转换运算:(int)从右到左
4乘除运算符:*,/,%从左到右
5加减运算符:+,-从左到右
6移位运算符:<<,>>从左到右
7关系运算符:<,<=,>,>=从左到右
8相等运算符:==,!=从左到右
9位与运算符:&从左到右
10位异或运算符:^从左到右
11位或运算符:``
12逻辑与运算符:&&从左到右
13逻辑或运算符:`
14条件运算符:?:从右到左
15赋值运算符:`=,+=,-=,*=,/=,%=,&=,^=,=,<<=,>>=`
16逗号运算符:,从左到右

运算符优先级和结合律

int *p[3];
// [],*,int:数组,里面是指针,指向int
int (*p)[3];
// *,[],int:指针,指向数组,数组中是int
int (*p)(int a);
// *,(int a),int:指针,指向参数为(int a)的函数,函数返回int
int (*p[3])(int a);
// [],*,(int a),int:数组,数组中是指针,指向参数为(int a)的函数,函数返回int
int(*(*p())[])();
// (),*,[],*,(),int:无参函数,返回一个指针,指向一个数组,数组中是指针,指向一个无参函数,函数返回int

[]运算级比*高

参考

  1. C语言运算符优先级
  2. C语言总结
  3. C复杂指针