发现C++中常量引用可以用指针间接修改,怎么回事?
int main(){
const int c = 10;
const int &re = c;
//re = 30;//err,直接修改肯定不行
const int *p = &re;
*((int*)p) = 30;
cout << "*p = " << *p << endl;
cout << "re = " << re << endl;//但常量引用re变成30了
cout << "c = " << c << endl; //常量c没变还是10
return 0;
}
常量引用re不是常量c的别称吗,它怎么会被修改了呢,这会在编程中产生什么影响呢? 修改的只是个副本。
寄存器的值根本没有变 不可能,值肯定没变,修改的应该是c++给你的副本 好东西 拿走了 这算是在骗编译器吗 修改的内存中的值 int main()
{
const int c = 10;
const int &re = c;
//re = 30;//err,直接修改肯定不行
const int *p = &re; //这里的&re表示将指针指向变量re的地址,跟上面的引用变量不同。
cout<<"re="<<re<<endl;//看看此时re是什么。
cout<<"*p="<<*p<<endl;//*p
*((int*)p) = 30; //因此,p指向的数据以及变量re的值,是同一回事,前面是10,后面重新赋值后变为30。
cout << "*p = " << *p << endl;
cout << "re = " << re << endl;//但常量引用re变成30了,在这里你会理解出错,是因为忽视了&有两个作用:引用和取地址。
cout << "c = " << c << endl; //常量c没变还是10
return 0;
}
int main()
{
const int c = 10;
const int &re = c;
const int *q=new int;
*((int*)q) = re; //这个应该是你想表达的意思,q指向的值和re值是同一个东西,注意和之前的区别
cout << "*q = " << *q << endl;
cout << "re = " << re << endl;
cout << "c = " << c << endl;
return 0;
} 本帖最后由 jessylake 于 2017-11-25 10:13 编辑
liphily 发表于 2017-11-25 01:28
单步走到第2个const时候就会发现,此处的&确实是引用
经过一通研究和向讲课老师请教,老师的解释是这样的:当对常量取地址时,系统会发生隐式操作,即编译器会开辟一个临时空间,并存入这个常量,引用实际上是指向这个临时空间,与这个临时空间进行绑定,或者说这个引用是这个临时空间的别名,通过指针修改值只是改变这个临时空间内的值,那个常量根本不受影响。不知道大家怎么看?
int main()
{
const int &re = 10;//因为re要绑定到常量10,所以涉及到对常量取地址,此时编译器会进行两步隐式操作:
//1、临时开辟一个临时空间: const int temp = 10;
//2、让re指向它,与之绑定,即:const int &re = temp; 也就是说可以用这两句替换 const int &re = 10;
//re = 30;//err,直接修改肯定不行
const int *p = &re;//此时指针p实际上是指向那个临时空间temp
*((int*)p) = 30; //这里通过类型强转改变temp里面的值,相当于 temp=30
cout << "*p = " << *p << endl;
cout << "re = " << re << endl;//因为re是与临时空间temp绑定的,所以常量引用re变成30了
return 0;
}
页:
[1]