在c ++中,我们知道我们不能将const int *转换为int *。但我有一个代码片段,我可以将const int *转换为int *。我是c ++的初学者,我用谷歌搜索了这个,但我只是提到const int *的链接无法转换为int *以避免const违规。我无法弄清楚为什么编译没有错误
#include <iostream>
using namespace std;
int main(void)
{
const int a1 = 40;
const int* b1 = &a1;
int* c1 = (int *)(b1);
*c1 = 43;
cout<< c1<<" "<< &a1<<endl;
cout<< *c1<<" "<< a1<<endl;
}
另外,问题是上述程序的输出是:
0x7fff5476db8c 0x7fff5476db8c
43 40
有人可以解释一下c1整数指针指向a1的相同地址但分别具有不同的值43和40。
答案 0 :(得分:6)
在C ++中,对象是const,或者不是。如果它是const而不是任何修改它的尝试将调用未定义的行为。那就是你做的。此时任何都可能发生。如果你很幸运,它会崩溃。如果你不那么幸运,它会正常工作,直到你的代码在客户手中,它会造成最大的损害。
您可以在C ++中轻松地将const int *转换为int *。你做的就是。但是,“const int *”和“int *”并不意味着指向的东西是const。它只是意味着编译器不允许您在一种情况下进行分配,并允许您在另一种情况下进行分配。 *c1
是const
。将指针强制转换为int*
并不会改变它为const
的事实。未定义的行为。
答案 1 :(得分:2)
它未定义的行为。
但是,在这种情况下,发生的事情是编译器已经意识到它可以用实际值40替换a1
语句中的cout
,因为它意味着是const
。
永远不要依赖于此。它可以很容易地对你的猫进行纹身。
答案 2 :(得分:1)
const int
变量将占用堆栈中的内存,但编译器只会将a1
的所有实例替换为40
。表达式&a1
将不会被替换,以及魔法以某种方式指向堆栈上的内存。更改内容时,内存中的内容将更改,但这些常量40
不会更改。因此它们的产量不同。
这只是未定义的行为,可能因编译器而异。一个编译器可能会导致显示43
,另一个可能会显示40
,而另一些编译器可能会生成导致崩溃的代码(写入只读内存)。不要这样做!
答案 3 :(得分:0)
运行它,也许有帮助。
const int a1 = 40;
std::cout<<"__________ const int a1 = 40; ____________________________________"<<std::endl;
std::cout<<"a1: "<< a1<<std::endl;
std::cout <<"&a1 "<< &a1<<std::endl;
std::cout <<"*a1: INVALID"<<std::endl;
const int* b1 = &a1;
std::cout<<"__________ const int* b1 = &a1; ____________________________________"<<std::endl;
std::cout<<"b1: "<< b1<<std::endl;
std::cout <<"&b1 "<< &b1<<std::endl;
std::cout <<"*b1 "<< *b1<<std::endl;
int* c1 = (int *)(b1);
std::cout<<"__________ int* c1 = (int *)(b1); ____________________________________"<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout <<"&c1 "<< &c1<<std::endl;
std::cout <<"*c1 "<< *c1<<std::endl;
*c1 = 43;
std::cout<<"__________ *c1 = 43; ____________________________________"<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout <<"&c1 "<< &c1<<std::endl;
std::cout <<"*c1 "<< *c1<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout<<"*c1: "<< *c1<<" -----> *&a1: "<< *&a1<<" - a1: "<< a1<<std::endl;
std::cout<<"&c1: "<< &c1<<std::endl;