为什么在链表中设置 pointer=null 指针和 pointer->next=null 指针时会产生不同的效果 - C++

Why do we have different effect when setting pointer=nullpointer and pointer->next=nullpointer in linked list - C++

我有以下代码片段(关于单链表)-

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;
}

这里,headp1 是独立的变量——意思是独立的内存位置。所以,当我们做p1=nullptr时,应该只影响p1,而不是head。而且,这就是我调试代码时发生的情况(如下图所示):

但是,当我执行 p1->next=nullptr 而不是 p1=nullptr 时,head 也会受到影响。如下图所示:

p1和head是不同的内存位置。因此 p1=nullptr 不影响 head。但是为什么p1->next=nullptr会影响head?

p1指向一串指针,head也指向一串指针(p1->next->next->next...和head->next->next->next...) . p1 与 head 位于同一内存位置。 p1->next 和 head->next 也位于同一内存位置(在我们说 p1=head 之后),其他 next 指针也是如此。那么,为什么将 p1 设置为 nullpointer(或任何其他值)不会影响 head。但是,将 p1->next 设置为 nullptr,影响头部?如果你能用盒装图回答我这里的内存是如何工作的,那将会很有帮助。谢谢!

您误解了您在调试器中看到的内容。 head 不受影响。

head 本身唯一的东西就是内存地址。仅此而已,仅此而已。

在你的第二个例子中,headp1->next=nullptr 之前一定是 0x007ce390,并且在赋值之后它仍然是完全相同的内存地址。

您的调试器帮助您显示的不仅仅是指针本身,它指向的实际内存地址,还有指针引用的所有值。由于 p1head 现在是同一个指针,设置 p1->next=nullptr 也会更改 head 指向的值,并且您的调试器会显示。

但是指针本身并没有改变。