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