【问题标题】:why does the runner pointer below not change to null?为什么下面的跑步者指针不会变为null?
【发布时间】:2015-11-16 17:06:36
【问题描述】:

为什么runner指针没有变为null?

Node* runner = head->next;
Node* reversedList = head;
reversedList->next = nullptr;

但在下面,它确实更改为 null

Node* reversedList = head;
reversedList->next = nullptr;
Node* runner = head->next;

【问题讨论】:

  • 这应该被标记为 C++,因为 nullptr 在 C 中不存在。
  • 你的问题不完整定义你正在使用的结构
  • 结构只是简单的链表节点,带有指向下一个指针和一个整数

标签: c++ pointers


【解决方案1】:

发出以下声明后

Node* runner = head->next;

'runner'指向'next'指向的地址内存(假设它是地址0x6543)。

(head->next) ------> 内容

以下两行:

Node* reversedList = head;

reversedList->next = nullptr;

所以,'next' 现在指向 NULL,但 'runner' 仍然指向 'next' 之前指向的地址,即 0x6543。

(head->next) --> NULL |内容

第二个例子有效,因为首先你让 head->next 指向 NULL,然后你让 'runner' 指向 head->next,现在是 NULL。由于 'head' 和 'reversedList' 都指向相同的地址,第二个示例(没有 reversedList)将是:

head->next = nullptr; 

Node* runner = head->next;

【讨论】:

  • 不应该将运行器指针更改为 nullptr 的 sn-p 中的这一行将其地址中的值更改为 null: reversedList->next = nullptr;因此 runner 应该已更改为 nullptr?或者问题应该是,为什么不将该地址中的值更改为 nullptr?
  • 不。 nullptr 处理的是指向内存地址的指针,而不是这些地址的内容。 stackoverflow.com/a/20509811
  • 打个比方:你拿两张纸,在两张纸上写上相同的电话号码。然后你撕一张纸(设置为nullptr)。你还有另一张完整的纸——上面有电话号码——而且它没有丢弃电话。 ;)
【解决方案2】:

在第一个中,您将指针 headhead->next 分别存储在 reversedListrunner 中。然后将reversedList->next 更改为nullptr,但runnerhead-next 的副本,而不是对指针本身的引用。因此它没有改变。

但是在第二个中,您创建了reversedList->next nullptr,然后复制了下一个指针(您刚刚创建了nullptr),因此该副本是nullptr

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2012-04-22
    • 2015-07-27
    • 2011-08-22
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多