【问题标题】:Why do we have different effect when setting pointer=nullpointer and pointer->next=nullpointer in linked list - C++为什么在链表中设置pointer=null 指针和pointer->next=null 指针会有不同的效果 - C++
【发布时间】:2020-01-25 18:54:15
【问题描述】:

我有以下代码sn-p(关于单链表)-

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

【问题讨论】:

    标签: c++ pointers singly-linked-list


    【解决方案1】:

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

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

    在您的第二个示例中,headp1->next=nullptr 之前必须是0x007ce390,并且在分配之后它仍然是相同的确切内存地址。

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

    但指针本身并没有改变。

    【讨论】:

    • 嗨 Sam,我知道 head 没有被改变,但是 head->next 指针在第二个例子中被改变(这导致本地窗口中的第一行显示为红色)。因此,当我们将 head 分配给 p1 时,本质上 head 和 p1 是相同的。那么,当我们之后执行 p1=nullptr 时(如第一个示例所示),为什么 head 也不会变为 null?
    • @VikramSingh 我认为您忽略了指针也是独立对象的事实。你可以有两个指针指向同一个东西,没问题。您可以使用这两个指针更改实际对象。但是您也可以更改这些指针之一以指向其他东西,为什么不呢。对指针本身的更改不会更改指向的对象,也不会更改指向该对象的其他指针。所以p1 = nullptr; 更改了其中一个指针,但不影响其他指针或指针对象。但是p1->next = nullptr; 改变了指针对象。
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2018-03-15
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多