为什么我不能直接将返回的引用分配给指针?

Why i can't assign a returned reference to a pointer directly?

本文关键字:分配 引用 指针 返回 不能 为什么      更新时间:2023-10-16

我已经声明了geta()函数来返回对a的引用,我必须在int指针中收集该引用。 代码工作正常,但为什么我无法使用注释行。它不是在做同样的事情吗? 代码如下:

#include<iostream>
using namespace std;
class Foo
{
int a=6;
public:
int& geta()
{
return a;
}
};
int main()
{
Foo f;
int &z = f.geta();          //int *p = f.geta();  Why this doesn't work?
int *p = &z;
cout << *p;
}

不要与 & 和 * 符号混淆。符号的含义在表达式和声明中是不同的。

当它在表达式中使用时,&表示地址运算符,它返回变量的地址。

但是,当在声明中使用 & 时(包括函数形式参数),它是类型标识符的一部分,用于声明引用变量(别名/备用名称)。

引用和指针不是一回事。你可以在这里查看...C++中的指针变量和引用变量有什么区别?

好吧,你不能断言指向 int 的指针: 相反,您可以为其分配新的内存和断言值,如以下代码:

#include <iostream>
#include <string>
using namespace std;
class Foo
{
int a;
public:
Foo():a(6) {}
int& geta()
{
return a;
}
};
int main()
{
Foo f;
int *p = new int;
*p = f.geta();
//int *p = &z;
cout << *p;
}
using namespace std;
class Foo
{
public:
int a;
int& geta()
{
return a;
}
};
int main()
{
Foo f;
f.a = 6;
int &z = f.geta(); //int *p = f.geta();  Why this doesn't work?
z = 10;   // 'z' is nothing but 'a'
int *p = &z;
cout << *p;
}

你可以在上面看到z只不过是a。 两者都指向相同的内存。int *p是一个包含地址的指针。所以要么你可以p = &z;*p = z;

int *p = f.geta();表示您正在分配对指针变量的引用,表示a地址*p无效。 当p = &ap = &z表示将a/z的地址分配给p取消引用时将为您提供值。 指针

好的答案已经在这里了,所以我借用了他们的一些好句子,并尝试为您提供一个更简单的答案。

请记住,指针是计算机内存的地址,当它带有星号时,它可能意味着做两件不同的事情:1_definition、2_dereferencing。

这里值得注意的是,您可以在定义指针的同一行或单独的行上进行初始化。所以这两个是等价的:

int x=8;
int *ptr=&x; //this is equivalent for
//this:
int *ptr;
ptr=&x;

几乎相同的两个任务是用 & 符号(防御和引用)完成的。您可以:

但是,1_define引用,这里有一个微妙的特殊规则需要注意,您不能在一行中定义引用并在另一行中引用它们。换句话说,每当定义引用时,都必须使用另一个变量初始化引用。从那一刻起,它就变成了它的别名!例如,如果它被引用到一个 int,它的行为真的很像那个 int!(就像你的情况一样),唯一的区别是它也会有那个int的地址,在幕后的某个地方

(即使对某个对象进行了引用,以后也无法将其更改为引用任何其他对象。

2_The符号所做的另一件事是(正如Monirul Islam Milon在另一个答案中所说)提取变量的地址

现在,在这些基本内容之后,您已经准备好查看以下内容了(如果您也运行它,则更好):

int main()
{
int j=25;
int* ptr;
ptr = &j;
int& ref1 = j, ref2 = *ptr;
//-------int& ref3 = ptr; // <-------- error!
//-------You can not assign an address to an int!
//-------Remember that in the valid examples above, ref1 and ref2 are really nothing but j
cout << "j is: " << j << endl;
cout << "ref1 is: "<< ref1 << 't' << "ref2 is: " << ref2 << endl;
cout << "They are both aliases for j";

在按引用传递函数中,同样的事情会发生,对象本身被发送到这些函数,尽管作为参数保存在别名(备用名称)中。 另请注意,在引用返回函数中,您不是返回地址,而是通过其别名(通过对它的引用)返回对象本身 - 无论它是什么。所以:

class_name& foo2(){
static class_name x=something;
return x;
} //OK
//but:
//-------int *ptr2 = foo2(); // <-------error!

同样在最后一行,您尝试将一个类(例如int,float,用户定义的类等)分配给指针,这显然是无效的(基于最基本的C++规则)。

我用这些链接为你写了这个答案:链接,链接,链接, 链接。

我希望它有所帮助。