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