提问者:小点点

对象指针在C++中是如何工作的?


我试图理解对象是如何存储在内存(堆)中的,以及引用变量是如何工作的。 我写了一个简单的程序来理解这个概念。 但是为什么当函数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


共1个答案

匿名用户

我仍然不清楚为什么当函数返回时,我得到的是被取消引用的地址,即*(&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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(对象|指针|c++|中|工作)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?