当我要修改指针到常量整数时,为什么我的编译器不显示错误
Why does not my compiler show an error when I want to modify a pointer to a constant integer?
这是代码。
int main()
{int v=2;
const int *p=&v;
++v; //Option 1: Does work, but why should it?
// ++*p; //Option 2: Does not work
}
编译器为期望的选项2丢弃了错误。但是,它与选项1一起修改指针到常量整数的内容时。为什么?或者,我是否了解const的含义有些不对劲?它仅适用于堆上而不是堆栈上的变量吗?
,或者,我对const的含义有什么不对劲?
的含义
是。
有:
int v = 2;
const int *p=&v;
您不允许您通过p
修改对象,但是您仍然可以通过v
直接修改对象。您也可以通过另一个指针修改对象。
int* p2 = &v
*p2 = 10; // OK.
const
并不意味着'常数',基本上是指"仅读"。当您定义指向const对象的指针时,这并不意味着对象永远无法更改 - 只是意味着您无法通过该指针写入该对象。。
实际上,指定对象既是const
(因此您不能更改)和volatile
(表明其他可能会更改它)是完全允许(有时有意义的)。例如,回到MS-DOS时代,BIOS将计时器维护在40:6c
的一个地址(偏移0x6c 0x40中的0x6c),该计时器每〜55毫秒更新一次,但是您不应该直接写入它,以便您可以定义指向它的指针:
long const volatile *bios_timer = MK_FP(0x40, 0x6c);
因此,试图写入此位置(至少是通过此指针)不允许,但是您从中读取的价值会定期更改。
[请注意,与上述声音相反:此(大概)仍然存在 - 但使用受保护的模式OS,尝试在用户模式下直接访问它将失败。]
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 为什么我的for循环不能正确获取argv
- 为什么二进制搜索在我的测试中不起作用
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我的 std::ref 无法按预期工作?
- 为什么我的删除节点函数实际上没有删除节点?
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 为什么我的多线程作业队列崩溃
- 为什么我的排序算法会更改数组值
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 为什么我的程序在for循环中k=0时返回垃圾值
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 为什么我的共享库中存在展开符号
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 为什么我的递归函数按降序打印,然后按升序打印?