c++ - 在 C++ 中修改 const int

标签 c++ pointers constants

运行下面的代码显示 &x=ptr,那么 x 和 *ptr 怎么不相等呢?

const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;

cout << &x << " " << x << "  " << ptr <<"  " <<*ptr;  //output : 0012FF60 10  0012FF60  11

最佳答案

只有在遵守规则的情况下,C++ 实现才能使程序运行。你违反了规则。 C++ 实现可能以这种方式运行:

  • 因为 x 被声明为 const,C++ 实现知道只要您遵守规则,它的值就不会改变。因此,无论在何处使用 x,C++ 实现都使用 10 而无需检查 x 是否已更改。
  • 因为 *ptr 指向一个非常量 int,所以实际执行存储和读取操作。这些“工作”是因为它指向的内存(表示 x 的位置)实际上并未被操作系统标记为只读。因此,您可以进行修改,尽管您不应该这样做。

请注意,如果您遵守规则,C++ 实现的行为将起作用。如果您没有修改 x,那么在 x 出现的任何地方使用 10 都可以正常工作。或者,如果您没有将 x 声明为 const,则 C++ 实现不会假定它始终为 10,因此只要 >x 被访问。这是 C++ 标准对实现的全部要求:如果您遵守规则,它就会工作。

如果您不遵守规则,C++ 实现可能会以看似不一致的方式中断。

关于c++ - 在 C++ 中修改 const int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842278/

相关文章:

c++ - VS 2013 自动支架完成

由其成员选择一个随机结构

c - 在结构中访问和设置数组值

C结构共享公共(public)指针?

c - 了解 C 中 const buffer 和 read() 的使用

Rust 中的嵌套常量

c++ - Eigen c++ 中的乘法矩阵给出了错误的维度

c++ - 在模板中提取常见的类行为

c++ - 模板运行版本不同于调试

c - 将 memcpy 与具有常量成员的目标结构一起使用是否合法?