我很惊讶c ++允许将解除引用的指针递增到常量数据,它不允许通过指向const数据的指针。考虑一下代码:
#include<iostream>
#include<climits>
using namespace std;
int main(){
int x = 2;
const int *xPtr2 = &x;
*xPtr2++;
cout << x << endl;
}
但是x的值仍然是2.这意味着* xPtr2实际上没有增加。我也试过* xPtr2 = 3,但这次它显示了编译错误。为什么会这样?
答案 0 :(得分:5)
这里++的优先级大于*的优先级。因此
*xPtr2++
相当于
*(xPtr2++)
由于xPtr2不是常量指针而是指向常量数据的指针,因此在这种情况下递增xPtr2并取消引用它是正常的(但不是其他指针),因此不会导致编译错误。
答案 1 :(得分:2)
增量的优先级高于解除引用的优先级。因此,您正在递增指针,然后取消引用递增的指针。指针不是常量,因此可以递增。
答案 2 :(得分:2)
++
运算符优先于解除引用。基本上你取消引用已增加的指针。
对于你想要完成的行为,你应该将指针包裹在parens中。
(*xPtr2)++;
同样适用于分配 - 您尝试将int
分配给int *
。它适用于parens。
(*xPtr2) = 3;
答案 3 :(得分:0)
您已提及
取消引用指向常量数据的指针
所以,让我们考虑以下代码
op
输出:#include <stdio.h>
int main() {
const int foo = 0xdead;
int* bar = (int*) &foo;
*bar = 0xcafe;
printf("const int foo = %#x", foo);
return 0;
}
在C中,C ++ const int foo = 0xcafe
只是变量的 编译时修饰符 。这意味着编译器不希望在编译时修改const
。在运行时,没有const
=&gt;的概念。所有局部变量都存储在堆栈中,所有const
和全局变量都存储在static
部分中。因此,您可以取消引用const并仅在运行时