Почему мы имеем разный эффект при установке указателя = nullpointer и указателя-> далее = нулевой указатель в связанном списке - C ++ - PullRequest
1 голос
/ 25 января 2020

У меня есть следующий фрагмент кода (относительно односвязного списка) -

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

Node* newNode(int data)
{
    Node* temp = new Node;
    temp->data = data;
    temp->next = nullptr;
    return temp;
}

int main()
{
    Node* head = newNode(2);
    head->next = newNode(4);

    Node* p1 = head;
    p1 = nullptr;

    return 0;
}

Здесь head и p1 - это отдельные переменные, что означает отдельную ячейку памяти. Таким образом, когда мы делаем p1=nullptr, должно быть произведено только p1, а не head. И вот что происходит, когда я отлаживаю код (как показано на рисунке ниже):

Linked List when pointer set to null - head is not effected

Но, когда я делаю p1-> next = nullptr вместо p1 = nullptr, также применяется head. Как показано на рисунке ниже:

head also effected

p1 и заголовок - это разные области памяти. Следовательно, p1 = nullptr не влияет на заголовок. Но почему p1-> next = nullptr влияет на head?

p1 указывает на строку указателей, а head также указывает на строку указателей (p1-> next-> next-> next ... и head -> next-> next-> далее ...). p1 находится в той же ячейке памяти, что и head. И p1-> next и head-> next также находятся в той же ячейке памяти (после того, как мы скажем p1 = head), как и другие указатели next. Итак, почему установка p1 в nullpointer (или любое другое значение) не влияет на заголовок. Но, установив p1-> рядом с nullptr, эффект головы? Если бы вы могли ответить мне в штучной диаграмме о том, как память работает здесь, это будет полезно. Спасибо!

1 Ответ

1 голос
/ 25 января 2020

Вы неправильно интерпретируете то, что видите в своем отладчике. head не затрагивается.

Единственное, что head само по себе - это адрес памяти. Ничего больше, ничего больше.

Во втором примере head должно быть 0x007ce390 до p1->next=nullptr, и это все тот же точный адрес памяти после присваивания.

Ваш отладчик показывает вам не только сам указатель, фактический адрес памяти, на который он указывает, но также и значения, на которые ссылается указатель. Поскольку p1 и head теперь являются одним и тем же указателем, установка p1->next=nullptr также изменяет значения, на которые указывает head, и ваш отладчик показывает это.

Но сам указатель не изменяется.

...