将递增递减操作符用于指针时,将把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针的递增和递减。下面来分析一段代码,整体代码如下:
#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插件自动生成
微信扫一扫,打赏作者吧~
![[整理][转载]win下网卡抓包发包库Npcap使用](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2023/08/demo_1-1024x711.jpg&w=280&h=210&zc=1)
![[转载]基础数据char,int,double,string是线程安全的吗?](http://www.jyguagua.com/wp-content/themes/begin/img/random/9.jpg)
![[整理]how to run flask with pyqt5](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2021/03/pyqt_flask.png&w=280&h=210&zc=1)