当我要修改指针到常量整数时,为什么我的编译器不显示错误

Why does not my compiler show an error when I want to modify a pointer to a constant integer?

本文关键字:我的 为什么 编译器 错误 显示 修改 我要 指针 整数 常量      更新时间:2023-10-16

这是代码。

    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,尝试在用户模式下直接访问它将失败。]