C++中的前/后增量指针
Pre/Post Increment Pointers in C++
*(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}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错