【问题标题】:Can somebody explain to me what is "reference reseating", and why is it not possible for "a reference to point(refer) to another object"? [duplicate]有人可以向我解释什么是“引用重新定位”,为什么“引用指向(引用)另一个对象”是不可能的? [复制]
【发布时间】:2015-10-31 17:57:11
【问题描述】:

根据这些链接:stackoverflow questionC++ FQA 引用一旦被初始化就不能很好地引用另一个对象/变量,但是下面的代码呢?

// Example program in C++
#include <iostream>
using namespace std;
int main()
{
    int x=10, z=12;
    int &y=x;
    ++y;
    y=z; //valid?
    cout << x << ", "<< y <<", " << z << endl; // prints 12, 12, 12
    return 0;
}

下面是关于指针重新定位的 C 代码,它似乎有效,对吗?

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a=10, b=20;
    int *ptr;   
    ptr = &a;
    ptr = &b;
    printf("%d\n",a); // prints 10
    printf("%d\n",*ptr); // prints 20
    return 0;
}

有人能把上面两个代码中的概念搞清楚吗?

【问题讨论】:

  • 您的代码说明了一切。 y=z; 更改为 x
  • 是的。重新定位指针很好,重新定位引用不是。
  • @chris 感谢您的评论,但是什么是参考重置?是不是参考从 x 到 z 重新安置!?
  • 请选择C和C++之一。 C 没有引用,所以我将其标记为 C++。如果您的意图不同,请重新标记。
  • @highlander141,C++ 没有合法的引用重置。最接近的是您的指针示例,这是 std::reference_wrapper 在您重新安装它时在内部执行的操作。

标签: c++ pointers reference


【解决方案1】:
y=z; //valid?

绝对!但是,这并不意味着“y 从现在开始指代z”。这意味着“将z 的值设置为y 当前所指的任何值”,即x。因此,y=zx=z 的另一种写法。

下面是关于指针重新定位的 C 代码,它似乎有效,对吗?

与引用不同,指针可以重新指向,因此指针的重新赋值使其指向不同的变量。但是,您的程序没有说明这一点,因为对 ptr 的两次分配发生时没有任何对 ptr 的读取,因此只有第二次分配保留。

【讨论】:

  • 感谢您的回答,什么是无效的表达式或至少我们如何尝试重新设置引用,我想我们得到编译时错误吧?
  • @highlander141 表达式有效,只是没有改变引用的值;它改变了引用所指的任何值。对于指针,您有两种语法:一种用于更改指针(不带星号),另一种用于更改指针指向的任何内容(带星号)。没有用于重新设置引用的语法:没有星号表示“更改引用所指的任何内容”,而星号是语法错误(除非引用指的是指针,但这完全是不相关的故事)。
【解决方案2】:

y=z

它没有引用另一个变量,它只是将z 的值分配给y,即12,并且由于y 引用了xx 也被分配了值12。

所以x=y=z=12

但是在指针中改变它指向的地址是有效的:

ptr = &a;
ptr = &b; //valid

【讨论】:

  • 感谢您的回答,那么关于 C++ 中的引用,什么是“无效表达式”
  • @highlander141 不管你给引用变量赋值多少次,它完全有效,因为它只是覆盖了变量的值,但它只是你不能在 c++ 中将引用重置为无效。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多