将递增递减操作符用于指针时,将把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针的递增和递减。下面来分析一段代码,整体代码如下:
#include <iostream> using namespace std; int main() { double arr[5] = {21.1, 32.8, 23.4, 45.2, 37.4}; double *pt = arr; // pt指向第一个数据元素,也就是arr[0],即21.1的地址 ++pt; //指向arr[1],即32.8的地址 cout << *pt << endl; cout << *++pt << endl; //先对指针进行++操作,然后+1后的指针进行取值 cout << ++*pt << endl; //先对指针取值,然后对值+1 cout << (*pt)++ << endl; //先对指针取值,然后对值+1 cout << *pt++ << endl; //先对pt进行++操作,然后对pt直接取值 cin.get(); return 0; }
double arr[5] = {21.1, 32.8, 23.4, 45.2, 37.4}; double *pt = arr; // pt指向第一个数据元素,也就是arr[0],即21.1的地址 ++pt; //指向arr[1],即32.8的地址
将*和++/--同时用于指针时,什么时候解除引用(也就是对指针指向的地址进行取值操作),什么时候递增或者递减呢?这取决于操作符的位置和优先级。前缀递增、前缀递减喝解除引用操作符的优先级相同,以从右至左的方式进行结合。后缀递增和后缀递减的优先级相同,但比前缀操作符的优先级高,这两个操作符以从左至右的方式进行结合。
前缀操作符的从右至左结合规则意味着*++pt的含义如下:先将++应用于pt(因为++位于*的右边),然后将*应用于被递增后的pt:
cout << *++pt << endl; //先对指针进行++操作,然后+1后的指针进行取值
那么同样的,++*pt意味着先获得pt指向的值,然后将这个值加1:
cout << ++*pt << endl; //先对指针取值,然后对值+1
在这种情况下,pt仍然指向arr[2].
接下来看下面这个组合:
cout << (*pt)++ << endl; //先对指针取值,然后对值+1
圆括号指出,首先对指针接触引用,得到24.4,然后操作符++将这个值递增到25.4,pt仍指向arr[2]
最后看下面的组合:
cout << *pt++ << endl; //先对pt进行++操作,然后对pt直接取值
后缀操作符++的优先级更高,这意味着将操作符用于pt,而不是*pt,因此对指针递增。然而后缀操作符意味着将对原来的地址(&arr[2])而不是递增后的新地址接触引用,因此*pt++的值是arr[2],即25.4,但此语句执行完毕后,pt的值将为arr[3]的地址。
文章的脚注信息由WordPress的wp-posturl插件自动生成