【发布时间】: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
我给出了一个函数foo(struct node *n),其中n 是链表中的头节点。
现在foo 应该更改n s.t.它指向列表的末尾。
但是这个函数签名可以做到吗?
假设t是指向列表末尾的指针:
n = t 不起作用,因为指针是按值传递的。*n = *t 不起作用,因为我会覆盖列表的头部。我错过了什么吗?
【问题讨论】:
标签: c pointers pass-by-value
不,您不能更改任何按值传递的参数。
【讨论】:
你没有错过任何东西。给定的函数声明是不可能的。
正如您所写,指针是按值传递的,因此如果更改,它不会传播到原始变量。
您需要将原型更改为foo(struct node **n); 或struct node *foo(struct node *n); 并将新指针作为结果返回。
【讨论】:
不,因为您拥有传入的指针值的副本。您无权访问传入的原始指针。为了在函数外部修改指针,sig 需要是 foo (结构节点**n)。
【讨论】:
a copy of the value of the pointer - 我明白,但不完全明白。我们传入一个指针,为什么不能改变它?毕竟是指针。
您无法更改 n 并让调用者看到更改。您可以更改 n->prev->next 和 n->next->prev - 这可能是您需要的。
【讨论】:
更改不可能反映在调用函数中。但是,在foo 中,您可以随意更改n。
int foo(struct node *n) {
n = NULL; /* ok */
}
【讨论】:
您需要使用指向指针的指针:
foo(struct node **n)
要更改 n 指向的内容,您可以:
*n = t;
【讨论】: