#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
const int a = 10;
cout << "&a = " << &a << endl; // 0x7fffffffdf24
const int *ptr = &a;
cout << "*ptr = " << *ptr << endl; // *ptr = 10
cout << "ptr = " << ptr << endl; // ptr = 0x7fffffffdf24
// *ptr2 = 20; //错误
int *ptr2 = const_cast<int *>(ptr);
cout << "ptr2 = " << ptr2 << endl; // ptr2 = 0x7fffffffdf24
*ptr2 = 20;
cout << "a = " << a << endl; // a = 10
cout << "*ptr = " << *ptr << endl; // *ptr = 20
cout << "*ptr2 = " << *ptr2 << endl; // *ptr2 = 20
cout << "&a = " << &a << endl; //&a = 0x7fffffffdf24
return 0;
}
平台:ubuntu20.04
编译器:gcc9
【以下回答由 GPT 生成】
我可以解答你的问题。
在C++中,const
关键字用于声明一个只读的变量或指针。这意味着,一旦变量或指针被声明为const
,它们的值就不能被修改。
然而,通过使用const_cast
,我们可以将一个const
指针转换为非const
指针。这种转换通常是不安全的,因为它会绕开C++的类型系统。
在你的代码中,你通过const_cast
将ptr
转换为非const
指针ptr2
。然后,你通过*ptr2 = 20
修改了ptr2
指向的值。
这导致了不一致的行为,因为你实际上修改了一个被声明为const
的变量的值。C++并没有提供一种安全的机制来阻止这种类型的转换和修改。
这种行为是未定义的行为,意味着它可能在不同的编译器和环境中产生不同的结果。在你的例子中,a
和*ptr
的值发生了变化,而ptr
的值没有变化。
如果你想修改一个常量指针所指向的值,可以考虑使用非常量指针来避免未定义行为。或者,如果你真的需要修改一个常量指针所指向的值,你可以考虑重新设计你的代码,以避免使用const
关键字。
因此,你的问题的答案是:通过使用const_cast
修改整型常量指针的值后,出现了两个不一样的值是因为这种行为是未定义的,不建议这样做。