【问题标题】:change pointer passed by value更改按值传递的指针
【发布时间】:2011-07-28 18:06:49
【问题描述】:

我给出了一个函数foo(struct node *n),其中n 是链表中的头节点。 现在foo 应该更改n s.t.它指向列表的末尾。

但是这个函数签名可以做到吗?

假设t是指向列表末尾的指针:

  • n = t 不起作用,因为指针是按值传递的。
  • *n = *t 不起作用,因为我会覆盖列表的头部。

我错过了什么吗?

【问题讨论】:

    标签: c pointers pass-by-value


    【解决方案1】:

    不,您不能更改任何按值传递的参数。

    【讨论】:

    • 函数接收指针的副本;因此,指针本身是按值传递的。当然,指针指向的实际上是通过引用传递的。
    • 请注意,您可以通过引用传递指针。但这是通过传递指针的地址来完成的。在这种情况下,您实际上是在将一个指针传递给一个指针。但是你还是在传递一些指针,而你传递的指针总是传值。
    【解决方案2】:

    你没有错过任何东西。给定的函数声明是不可能的。

    正如您所写,指针是按值传递的,因此如果更改,它不会传播到原始变量。

    您需要将原型更改为foo(struct node **n);struct node *foo(struct node *n); 并将新指针作为结果返回。

    【讨论】:

      【解决方案3】:

      不,因为您拥有传入的指针值的副本。您无权访问传入的原始指针。为了在函数外部修改指针,sig 需要是 foo (结构节点**n)。

      【讨论】:

      • a copy of the value of the pointer - 我明白,但不完全明白。我们传入一个指针,为什么不能改变它?毕竟是指针。
      • 也许这个其他帖子会为你澄清这件事:stackoverflow.com/questions/21604946/…
      【解决方案4】:

      您无法更改 n 并让调用者看到更改。您可以更改 n->prev->nextn->next->prev - 这可能是您需要的。

      【讨论】:

        【解决方案5】:

        更改不可能反映在调用函数中。但是,在foo 中,您可以随意更改n

        int foo(struct node *n) {
            n = NULL; /* ok */
        }
        

        【讨论】:

          【解决方案6】:

          您需要使用指向指针的指针:

          foo(struct node **n) 
          

          要更改 n 指向的内容,您可以:

          *n = t;
          

          【讨论】:

            猜你喜欢
            • 2014-04-07
            • 2016-12-25
            • 1970-01-01
            • 1970-01-01
            • 2020-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多