更改按值传递的指针

时间:2011-04-03 19:05:12

标签: c pointers pass-by-value

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

但这个功能签名是否可以实现?

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

  • n = t将无效,因为指针是按值传递的。
  • *n = *t无效,因为我会覆盖列表的头部。

我错过了什么吗?

6 个答案:

答案 0 :(得分:6)

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

foo(struct node **n) 

要更改n指向的内容,请执行以下操作:

*n = t;

答案 1 :(得分:5)

不,因为你有一个传入的指针值的副本。你无法访问传入的原始指针。为了修改函数外的指针,sig需要是foo (struct node ** n)。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

更改无法在调用函数中反映出来。但是,在foo内,您可以将n更改为您心中的内容。

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