Как работает указатель на объект в c ++? - PullRequest
0 голосов
/ 12 июля 2020

Я пытался понять, как объекты хранятся в памяти (куче) и как работает ссылочная переменная. Я написал простую программу, чтобы понять концепцию. Но почему я получаю разыменованный адрес, т.е. *(&cat), но не &cat, когда функция callBar() возвращает адрес?

#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 Ответ

2 голосов
/ 12 июля 2020

Мне до сих пор непонятно, почему я получаю разыменованный адрес, т.е. * (& 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...