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

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:08

本帖最后由 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]
查看完整版本: 发现C++中常量引用可以用指针间接修改,怎么回事?