C++中的前/后增量指针

Pre/Post Increment Pointers in C++

本文关键字:指针 C++      更新时间:2023-10-16

*(p1++)

int array[10] = {1,2};
int *p1 = array;
*p1=24;
*p1= *(p1++);
for (int i : array)
    cout << i << " ";

输出为24 24

*(++p1)

int array[10] = {1,2};
int *p1 = array;
*p1=24;
*p1= *(++p1);
for (int i : array)
    cout << i << " ";

输出为24 2

这似乎与使用值进行增量正好相反。有人能解释一下这里发生了什么吗?谢谢

中存在未定义的行为

*p1 = *(p1++);

因为,引用§1.9/15:

如果标量上有副作用对象相对于同一标量对象上的另一个副作用或值计算未排序使用相同标量对象的值,行为是未定义的。

这里的副作用是p1的增量,并且值计算是使用p1的地址计算。

所以你不应该依赖你的例子的确切结果。

*p1= *(p1++);

这根本没有道理。此操作的语义根据首先评估=的哪一侧而不同。因此,你无法从中获得任何意义。

对于*(p1++):

*p1 = *(p1++)

p1++将递增p1以指向数组中的索引1,并返回p1的上一个值(索引0)。因此*(p1++)将返回24,而*p1现在将等于2。然后将返回值(24)分配给*p1,因此数组将为{24,24}

对于*(++p1):

*p1 = *(++p1)

++p1将递增p1以指向数组中的索引2,并返回p1的当前值(索引1)。因此*(++p1)将返回2,而*p1现在将等于2。然后为*p1分配返回值(2),这是p1(1)索引处的原始值,因此数组将保持{24,2}