为什么我们可以在C ++中将解除引用的指针递增到常量数据?

时间:2015-09-01 00:18:46

标签: c++ pointers

我很惊讶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,但这次它显示了编译错误。为什么会这样?

4 个答案:

答案 0 :(得分:5)

这里++的优先级大于*的优先级。因此

*xPtr2++

相当于

*(xPtr2++)

由于xPtr2不是常量指针而是指向常量数据的指针,因此在这种情况下递增xPtr2并取消引用它是正常的(但不是其他指针),因此不会导致编译错误。

答案 1 :(得分:2)

增量的优先级高于解除引用的优先级。因此,您正在递增指针,然后取消引用递增的指针。指针不是常量,因此可以递增。

答案 2 :(得分:2)

++运算符优先于解除引用。基本上你取消引用已增加的指针。

对于你想要完成的行为,你应该将指针包裹在parens中。

(*xPtr2)++;

同样适用于分配 - 您尝试将int分配给int *。它适用于parens。

(*xPtr2) = 3;

请参阅your example in ideone

答案 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并仅在运行时

中对其进行修改
相关问题