更改按值传递的指针
我给了一个函数foo(struct node *n)
,其中n
是链表中的头节点。 现在foo
应该改变它指向列表的末尾。
但这个function签名是否可行?
假设t
是指向列表末尾的指针:
-
n = t
将无法工作,因为指针是按值传递的。 -
*n = *t
不起作用,因为我会覆盖列表的头部。
我错过了什么?
您需要使用指针指针:
foo(struct node **n)
要更改n
指向的内容,您可以:
*n = t;
不,因为你有一个传入的指针值的副本。你无法访问传入的原始指针。为了修改函数外的指针,sig需要是foo(struct node) ** N)。
你没有错过任何东西。 使用给定的函数声明是不可能的。
在您编写时,指针按值传递,因此如果更改,它将不会传播到原始变量。
您需要将原型更改为foo(struct node **n);
或struct node *foo(struct node *n);
并返回新指针作为结果。
不,您不能更改按值传递的任何参数。
您无法更改n
并让呼叫者看到更改。 您可以更改n->prev->next
和n->next->prev
– 这可能是您所需要的。
改变不可能在调用函数中反映出来。 但是,在foo
,您可以将n
更改为您的心脏内容。
int foo(struct node *n) { n = NULL; /* ok */ }