吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3025|回复: 9
收起左侧

[C&C++ 转载] 发现C++中常量引用可以用指针间接修改,怎么回事?

[复制链接]
jessylake 发表于 2017-11-24 22:35
[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的别称吗,它怎么会被修改了呢,这会在编程中产生什么影响呢?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

isnullorempty 发表于 2017-11-24 22:38
修改的只是个副本。
寄存器的值根本没有变
Allyn0303 发表于 2017-11-24 22:39
不可能,值肯定没变,修改的应该是c++给你的副本
13270652983 发表于 2017-11-24 22:55
w7lau 发表于 2017-11-24 23:29
这算是在骗编译器吗
小坤9 发表于 2017-11-24 23:51
修改的内存中的值
_达圣 发表于 2017-11-25 01:15
[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;
}


[C++] 纯文本查看 复制代码
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:08
本帖最后由 jessylake 于 2017-11-25 10:13 编辑

liphily 发表于 2017-11-25 01:28
单步走到第2个const时候就会发现,此处的&确实是引用


经过一通研究和向讲课老师请教,老师的解释是这样的:当对常量取地址时,系统会发生隐式操作,即编译器会开辟一个临时空间,并存入这个常量,引用实际上是指向这个临时空间,与这个临时空间进行绑定,或者说这个引用是这个临时空间的别名,通过指针修改值只是改变这个临时空间内的值,那个常量根本不受影响。不知道大家怎么看?

[C++] 纯文本查看 复制代码
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;
}


您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 08:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表