摘自:http://blog.csdn.net/cool8jay/article/details/1737521
圆括号()的优先级是1,结合方向是自左向右。
指针运算符*和自增运算符++的优先级都是2,结合方向都是自右向左。
把指针运算符*,自增运算符++和圆括号与一个指针变量p搭配,可以都得到以下运算组合:(假定之前有p=&a;)
1、*p++
2、*p(++)
3、(*p)++
4、*++p
5、*(++p)
6、++*p
7、++(*p)
分析结果:
1、*p++,p先跟*结合了,得到p指向的变量的值,即(*p),然后p再跟++结合,使指针p指向内存中下一个位置。结果改变不能立即看出。
2、*p(++),虽然有优先级更高的圆括号()把++括起来,但就算要先计算括号里面的东西,光有一个++,什么也做不了。没办法,只能让p先跟*结合,再跟++结合。这就跟第1种组合一样。
3、(*p)++,由于优先级,圆括号里面的先计算,所以先取*p,再使(*p)自增1,而不是使指针p指向内存中下一个位置。结果改变不能立即看出。
4、*++p,由于结合性,这种写法体现了++和*自右向左的结合方向,先使指针p指向内存中下一个位置,再取*p。结果改变可以立即看出。
5、*(++p),同第4种组合。
6、++*p,由于结合性,这种写法体现了++和*自右向左的结合方向,先使*p自增1,再取*p。结果改变可以立即看出。
7、++(*p),同第6种组合。
总结一下:
*p++等价于*p(++),取值,移位。
(*p)++,取值,增值。
*++p等价于*(++p),移位,取值。
++*p等价于++(*p),增值,取值。