我尝试创建一个将节点添加到列表开头的函数,然后更改变量“head”(保持列表的上一个开头)以包含新节点。
void addToStart(node * n, node * first){
printf("[Before adding] Node: %d, First: %d\n",&(*n),&(*first));
n->next = first;
first = n;
printf("[After adding] Node: %d, First: %d\n",&(*n),&(*first));
}
int main(){
node * head = createNode(0);
printf("This is the location of head: %d\n",&(*head));
node * fred = createNode(2);
addToStart(fred,head);
traverse(head); //Displays the list starting from the given node
return 0;
}
这是输出:
This is the location of head: 10113040
[Before adding] Node: 10113072, First: 10113040
[After adding] Node: 10113072, First: 10113072
(0)[10113040]->NULL
问题在于我希望函数能够改变head
指向的内容,但实际上没有任何改变。
答案 0 :(得分:0)
因为addToStart
将头指针的副本作为node *
。要更改头部,您需要使用
void addToStart(node * n, node ** first){
// ^
printf("[Before adding] Node: %d, First: %d\n",&(*n),&(**first));
n->next = *first;
// ^
*first = n;
// ^
printf("[After adding] Node: %d, First: %d\n",&(*n),&(**first));
}
编辑 C中的每个函数都有自己的参数副本,所以实际上没有像C ++或其他语言那样的引用。无论你在哪里使用引用,快速和肮脏的选项(可能并不总是有效!)是在每次提及前加上额外的*
。在这里,您希望first
成为参考。 first
是一个节点指针,因此它已经是node *
。要将其用作“参考”(原样),它会获得额外的*
,因此node **
。同样,无论在何处引用,都会获得额外的*
:*first = ...
。
有关Java内部的更多信息,请参阅a Java answer that's related。基本上,第一个*
隐含在Java实例变量中。因此,Java中的Node n;
(类似于)C中的Node *n;
。
希望有所帮助 - 绝对检查页面顶部链接的重复问题,以及那里的答案。如果您遇到另一个代码问题,请问另一个问题!
C向导注意:是的,我知道盲目添加*
是一个坏主意!不过,它有时很有用。我试图以一种将OP向前推进一步的方式回应OP的评论。