Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 谁能给我解释一下什么是“引用重置”,为什么“引用指向(引用)另一个对象”是不可能的?_C++_Pointers_Reference - Fatal编程技术网

C++ 谁能给我解释一下什么是“引用重置”,为什么“引用指向(引用)另一个对象”是不可能的?

C++ 谁能给我解释一下什么是“引用重置”,为什么“引用指向(引用)另一个对象”是不可能的?,c++,pointers,reference,C++,Pointers,Reference,根据这些链接:和引用在初始化后不能很好地引用另一个对象/变量,但是下面的代码呢 // 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 <<", " &l

根据这些链接:和引用在初始化后不能很好地引用另一个对象/变量,但是下面的代码呢

// 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中

它没有引用另一个变量,它只是把z的值赋给y,y是12,因为y是x的引用,x也得到赋值12

所以x=y=z=12

但在指针中,更改其指向的地址是有效的:

ptr = &a;
ptr = &b; //valid
绝对是!然而,这并不意味着从现在起y指的是z。这意味着将z的值设置为y当前引用的任何值,即x。因此,y=z是写入x=z的另一种方式

下面是关于指针重置的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;
}

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

您的代码说明了一切。y=z;是的。重置指针是好的,重置引用不是。@chris谢谢你的评论,那么什么是引用重置呢?这不是从x到z的参考重置吗!?请选择C和C++中的一个。C没有引用,所以我把它标记为C++。如果你的意图不同,请重新标记。@ HunDele141,C++没有法律参考重新设置。最接近的是指针示例,这是std::reference_包装器在重新安装时在内部所做的操作。感谢您的回答,那么,C++中的“无效表达式”是指C++中的“引用”变量,不管你如何将值赋值给引用变量,它完全有效,因为它只是变量的重写值,但是它只是不能重置引用,因为它在C++中是无效的。谢谢你的回答,什么是无效的表达式,或者至少是我们如何尝试重置引用,我猜我们得到了编译时错误,嗯?@highlander141表达式是有效的,只是它没有改变引用的值;它更改引用所引用的任何内容的值。对于指针,您有两个语法:一个用于更改不带星号的指针,另一个用于更改带星号的指针指向的任何对象。没有用于重新设置引用的语法:没有星号意味着更改引用所引用的内容,星号是一个语法错误,除非引用引用了指针,但这完全是一个无关的故事。