10-递增递减运算符和指针
5.1.8 递增/递减运算符和指针
可以将递增运算符用于指针和基本变量。本书前面介绍过,将递增运算符用于指针时,将把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针递增和递减:
double arr[5] = {21.1, 32.8, 23.4, 45.2, 37.4};
double *pt = arr; // pt points to arr[0], i.e. to 21.1
++pt; // pt points to arr[1], i.e. to 32.8
也可以结合使用这些运算符和运算符来修改指针指向的值。将和++同时用于指针时提出了这样的问题:将什么解除引用,将什么递增。这取决于运算符的位置和优先级。前缀递增、前缀递减和解除引用运算符的优先级相同,以从右到左的方式进行结合。后缀递增和后缀递减的优先级相同,但比前缀运算符的优先级高,这两个运算符以从左到右的方式进行结合。
前缀运算符的从右到左结合规则意味着++pt的含义如下:先将++应用于pt(因为++位于的右边),然后将*应用于被递增后的pt:
double x = *++pt; // increment pointer, take the value; i.e., arr[2], or 23.4
另一方面,++*pt意味着先取得pt指向的值,然后将这个值加1:
++*pt; // increment the pointed to value; i.e., change 23.4 to 24.4
在这种情况下,pt仍然指向arr[2]。
接下来,请看下面的组合:
(*pt)++; // increment pointed-to value
圆括号指出,首先对指针解除引用,得到24.4。然后,运算符++将这个值递增到25.4,pt仍然指向arr[2]。
最后,来看看下面的组合:
x = *pt++; // dereference original location, then increment pointer
后缀运算符++的优先级更高,这意味着将运算符用于pt,而不是pt,因此对指针递增。然而后缀运算符意味着将对原来的地址(&arr[2])而不是递增后的新地址解除引用,因此pt++的值为arr[2],即25.4,但该语句执行完毕后,pt的值将为arr[3]的地址。
注意: 指针递增和递减遵循指针算术规则。因此,如果pt指向某个数组的第一个元素,++pt将修改pt,使之指向第二个元素。