首页 > 解决方案 > 为什么我们在链表中设置pointer=nullpointer和pointer->next=nullpointer时会有不同的效果-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 会影响头部呢?

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,效果头?如果你能用方框图来回答我这里的内存是如何工作的,那将会很有帮助。谢谢!

标签: c++pointerssingly-linked-list

解决方案


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

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

在您的第二个示例中,headmustve be 0x007ce390before p1->next=nullptr,并且在分配之后仍然是相同的确切内存地址。

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

但指针本身并没有改变。


推荐阅读