【问题标题】:Does setting a pointer to NULL affect original item you were pointing at?将指针设置为 NULL 会影响您指向的原始项目吗?
【发布时间】:2016-07-16 12:09:07
【问题描述】:

我有一个指向链表中节点的指针:

struct node *temp = head.next

如果我设置这个指针等于NULL 如:

temp = NULL;

这也会影响我指向的节点吗?即head.next 现在是NULL

【问题讨论】:

  • 除了 C++ 中的引用变量,设置一个变量永远不会对另一个变量产生任何影响。
  • 这个问题可以反过来问,本质上是一样的。 struct node *temp = NULL; temp = head.next; NULL 会变成 head.next 吗?当然不是……那绝对没有意义。
  • 查看我在回答中使用的类比。 :P :D
  • 当你写了一些简单的代码来解决这个问题时发生了什么?至少你会看到你的实现做了什么。
  • 不要尝试编写多语言源文件。这是一项极其艰苦的工作,与编写单语言源文件(各种文件而不是一个文件)相比,任何可能的优势都非常非常小。

标签: c++ c pointers linked-list


【解决方案1】:

这也会影响我指向的节点吗?即 head.next 现在为 NULL?

没有。


这样想吧。 head.next 是一个保存值(地址)的变量。当你这样做
struct node *temp = head.next

现在temp 的值也与head.next 相同。

以后当你改变temp的值时,为什么head.next持有的值要改变。


这是复制变量的值(在这种情况下正在发生)与使变量引用其他变量并更改其内容时的区别。


如果你想要后者,那么你需要一个pointer to pointer to struct node

类似

struct node **temp = &head.next;

现在如果你想通过temp也改变head.next的内容,你可以这样做

*temp = NULL;

【讨论】:

    【解决方案2】:

    不,因为您没有更改指针的内容。

    你只是让他指点别的东西。

    【讨论】:

    • @Vucko @STF,我认为艺术具有误导性。这意味着temp 指向head.next,,但实际上temphead.next 都指向其他一些节点结构。
    【解决方案3】:

    不,它不会。您必须了解更新指针时不会更新其内容或它指向的内存位置。为此,您必须明确地这样做。

    现在解决您的问题:

    temp 持有 head->next 所在的内存位置的地址。像 (0x980901) 将其设置为 null 之类的东西只会更改它指向的地址,即。现在它不会指向任何东西。

    让我用一个比喻来向你解释这一点。假设你有一张纸,上面写着你朋友家的地址。你把这张纸上写的内容擦掉,这是否意味着你的朋友被搬出了他的房子?显然不是。

    在你的情况下,这张纸是临时指针。

    【讨论】:

      【解决方案4】:

      以上所有答案都解释得很好,但可能会让刚开始学习指针的人感到困惑。

      temphead.next 都是 struct node * 类型的变量。暂时忘记指针,想想你的问题,如果两个struct node * 变量都只有int

      看这个类比:

      int a = 1;
      int b = a;
      b = 0;
      // a remains 1, b is 0
      

      现在回到你的问题:

      struct node* head.next = 1; // Some initial value
      
      struct node* temp = head.next; // temp now has the value of 1
      temp = NULL; // temp assigned the value of NULL, variable head.next remains unchanged
      

      【讨论】:

        【解决方案5】:

        指针没有什么神奇或特别之处,它们遵循与任何其他变量类型相同的规则。

        考虑:

        int x = 5;
        int y = x;
        y = 0;
        

        y = 0; 当然不会改变x 的值。这同样适用于您的示例。

        我认为您在某种程度上将此与更改指向变量的内容混淆了。如果你愿意这样做

        int x = 5;
        int* y = &x;
        *y = 0;
        

        然后*y = 0; 将更改为x。但y 将保持不变 - 它仍然指向x

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-04
          • 2021-11-15
          • 2010-12-25
          • 2016-03-05
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          相关资源
          最近更新 更多