Как называются эти типы указателей и как они работают? - PullRequest
0 голосов
/ 12 марта 2020

Я час гуглял, пытаясь понять использование указателей в этом коде, но безрезультатно.

#include <cstddef>

using namespace std;

class Node {
    public:
        int data;
    Node * next;
};

int main() {
    Node * head = NULL;
    Node * second = NULL;
    Node * third = NULL;

    head = new Node();
    second = new Node();
    third = new Node();

    head->data = 1;
    head->next = second;

    second-> data = 2;
    second-> next = third;

    third-> data = 3;
    third-> next = NULL;
}

Я не совсем понимаю, как используются эти указатели.

Node * head = NULL;
    Node * second = NULL;
    Node * third = NULL;

    head = new Node();
    second = new Node();
    third = new Node();

Почему указатель указывает на конструктор класса? Разве он не должен указывать на адрес памяти? Как называется эта особая техника использования указателей? Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Ааа ... Они будут называться "указатели на узлы" или "указатели на узлы". Их цель - указать на Node с. ;)

В сторону Snark, ваше понимание самих указателей кажется нормальным: указатели хранят адрес памяти некоторого фрагмента данных.

В head = new Node() вы неправильно поняли, как новое ключевое слово и Конструктор взаимодействует: new выделяет память для нового объекта, вызывает конструктор класса и возвращает адрес вновь созданного экземпляра. В этом случае head = new Node() создает новый объект Node в памяти и возвращает адрес, который затем сохраняется в head`.

Похоже, вы могли бы извлечь пользу из хорошей ссылки на C ++, как уже упоминалось в нескольких комментариях. Я могу порекомендовать Learn C ++ , если вы не любите книги. Вы могли бы найти полезным введение в указатели и введение в "динамическое выделение памяти c" , которое всего о new и его аналоге delete.

0 голосов
/ 12 марта 2020

Указатель указывает на класс конструктора, потому что класс конструктора возвращает указатель на новый объект. По сути, new Node(); выделяет место в памяти для нового узла, возвращающего адрес памяти в начале. Таким образом, строка head = new Node(); инициализирует заголовок. Без этого head->data = 1; сгенерирует ошибку сегментации, поскольку head не ссылается на пространство памяти. Не стесняйтесь отвечать на любые дополнительные вопросы

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