我已声明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;
}
答案 0 :(得分:6)
不要对&amp;和*符号。符号的含义&amp;在表达式和声明中有所不同。
在表达中使用时,&amp;表示运算符的地址,它返回变量的地址。
然而,当&amp;用于声明(包括函数形式参数),它是类型标识符的一部分,用于声明引用变量(别名/备用名称)。
参考和指针不是一回事。 你可以在这里查看... What are the differences between a pointer variable and a reference variable in C++?
答案 1 :(得分:0)
好吧,你不能把指针指向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;
}
答案 2 :(得分:0)
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 = &a
或p = &z
表示将a
/ z
的地址分配给p
时,取消引用会为您提供值。
pointer
答案 3 :(得分:0)
已经有了很好的答案,所以我借用了一些好的句子,试着为你提供一个更简单的答案。
请记住,指针是计算机内存的地址,当它带有带星号的 时,它可能意味着做两件不同的事情:1_definition, 2_dereferencing。
值得注意的是,您可以在定义指针,或单独行的同一行进行初始化。所以这两个是等价的:
int x=8;
int *ptr=&x; //this is equivalent for
//this:
int *ptr;
ptr=&x;
几乎相同的两个任务使用&符号(defenition和referencing)完成。你可以:
1_define引用,但是,这里要注意的一个微妙的特殊规则,你可以在一行中定义引用并在另一行中引用它们。换句话说,无论何时定义引用,必须使用其他变量初始化引用。从那一刻开始,它变成了别名!例如如果它被引用到int,它的行为就像那个int!(就像你的情况一样),唯一的区别是它也会有那个int的地址,在幕后的某个地方< /强>
(即使您对某个对象进行了引用,也无法在以后将其更改为引用任何其他对象。)
2_&符号所做的另一件事是(正如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!
再次在最后一行中,您尝试将一个类(egint,float,用户定义的等等)分配给指针,这显然是无效的(基于最多) C ++的基本规则。)
我已使用这些链接为您撰写此答案:link,link,link, link
我希望它有所帮助。