c++ - 为什么通过指针分配给常量没有效果?

标签 c++ pointers constants

<分区>

在下面的示例中,“ptr”指向常量变量“local”。为什么通过分配 '*ptr' 修改 'local' 不会更改 'local' 的值?

#include <stdio.h>
int main(void)
{
    const int local = 10;
    int *ptr = (int*) &local;

    printf("address of local: %p \n", &local);
    printf("value of ptr: %p \n", ptr);
    printf("Initial value of local : %d \n", local);
    printf("Initial value of *ptr : %d \n", *ptr);

    *ptr = 100;
    //*((int*)&local) = 1000;

    printf("Modified value of local: %d \n", local);
    printf("Modified value of *ptr: %d \n", *ptr);
    printf("address of local: %p \n", &local);
    printf("value of ptr: %p \n", &(*ptr));

    return 0;
}

输出:

address of local: 0x7ffd946bd9c4
value of ptr: 0x7ffd946bd9c4
Initial value of local : 10 
Initial value of *ptr : 10 
Modified value of local: 10 
Modified value of *ptr: 100 
address of local: 0x7ffd946bd9c4 
value of ptr: 0x7ffd946bd9c4

最佳答案

行:

*ptr = 100;

是未定义的行为。之所以这样是因为ptr 指向了一个const 对象。您通过放弃 const-ness 进行了此编译,但语言仍然说实际修改声明为 const 的对象是非法的:http://en.cppreference.com/w/cpp/language/const_cast .

未定义行为的存在基本上意味着您的程序可以在不同的编译器/优化级别上做许多不同的、奇怪的事情。简而言之,不要修改 const 对象,并且暂时避开 const_cast。这通常是糟糕设计的标志;它的合法用途相对较少,您可以边学边学。这是一个罕见的有效使用 const_cast 示例的链接:How do I remove code duplication between similar const and non-const member functions? .这种技术消除了代码重复,但从根本上说,它依赖于在只有 指针 是 const 限定的但基础对象不是 const 的情况下丢弃 const-ness。

实际 const 值与 const 别名指针/引用之间的区别在 C++ 中非常重要。

关于c++ - 为什么通过指针分配给常量没有效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45822661/

相关文章:

c++ - "static const int"导致链接错误( undefined reference )

c++ - 在2D数组中遇到一些问题以在C++中添加每个按行元素

c++ - 在结构或类中使用智能指针

c++ - 可选元素会破坏 RAII 吗?如果是,什么是更好的方法?

c - 如何使函数中的指针更改C中的指针

ruby - 如何在 Ruby 中找到方法的嵌套?

php - 我应该在哪里保持流明常数?

c++ - 使用 C++ 通过 HTTPS 的 json-rpc 服务器?

c++ - Imap 在特定日期后不下载电子邮件

c - 指针操作