我试图理解对象是如何存储在内存(堆)中的,以及引用变量是如何工作的。 我写了一个简单的程序来理解这个概念。 但是为什么当函数callbar()
返回地址时,我得到的是被取消引用的地址,即*(&cat)
,而不是&cat
呢?
#include<iostream>
using std::cout;
using std::string;
class Cat{
public: string name;
};
Cat* callBar(Cat *cat){
cat = new Cat();
cout<<&cat<<"\n";
cout<<*(&cat)<<"\n";
return cat;
}
int main(void){
Cat *c = new Cat();
cout<<&c<<"\n";
cout<<callBar(c)<<"\n";
cout<<*(&c)<<"\n";
return 0;
}
代码的输出为:
0x7ffd38985d70
0x7ffd38985d48
0x56368fbd22b0
0x56368fbd22b0
0x56368fbd1e70
我主要创建了类的实例并打印了它的地址。 我把这个对象传递给另一个函数,然后再次打印它的地址,这给了我新的引用。 最后,我推迟了。
我仍然不清楚为什么当函数返回时,我得到的是被取消引用的地址,即*(&cat)
,而不是&cat
?
我仍然不清楚为什么当函数返回时,我得到的是被取消引用的地址,即*(&cat),而不是&cat?
在callbar
内部,相关位为。。。
Cat* callBar(...unused argument...){
cat = new Cat();
cout << &cat << "\n";
cout << *(&cat) << "\n";
return cat;
}
您无法取回&cat
,因为您的返回语句是return cat;
而不是return&cat;
。
但是--剩下的问题--为什么会得到*(&cat)
? 这里的&
运算符取cat*cat
局部变量的地址,然后用*
取消引用它:这些操作取消,因此*(&cat)==cat
。