C 为什么不是';我的链接列表的标题没有改变吗?

C 为什么不是';我的链接列表的标题没有改变吗?,c,data-structures,linked-list,C,Data Structures,Linked List,我尝试创建一个函数,将一个节点添加到列表的开头,然后更改变量“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

我尝试创建一个函数,将一个节点添加到列表的开头,然后更改变量“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
指向的内容,但实际上没有任何更改。

因为
addToStart
将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));
}
<>强>编辑< /强> C中的每个函数都得到了自己的参数副本,所以实际上没有像C++或其他语言那样的引用。无论您在哪里使用参考资料,快速而肮脏的选项(可能并不总是有效!)就是在每个参考资料前面加上一个
*
。在这里,您首先希望
作为参考
first
是一个节点指针,因此它已经是一个
节点*
。要将其用作“引用”(实际上),它会得到一个额外的
*
,因此
节点**
。类似地,无论在哪里引用它,它都会得到一个额外的
*
*first=…

有关Java内部构件的更多信息,请参阅。基本上,第一个
*
隐式地存在于Java实例变量中。So
Node n有点像
Node*n在C中

希望这会有所帮助-请务必查看页面顶部链接的重复问题,以及那里的答案。如果您遇到另一个代码问题,只需问另一个问题


C向导注意:是的,我知道盲目添加
*
是个坏主意!不过,它有时很有用。我正试图以一种将OP向前推进一步的方式回应OP的评论。

first=n
addToStart
中更改函数参数
first
,但不更改
head
from
main
first
head
的副本,因为C是按值传递的,只有副本被更改。这与
void f(int n){n=0;}
不能用于将整数设置为零的原因相同。与C语言中的所有内容一样,首先尝试理解
int
的情况,然后推广到其他类型。关于“int”的情况,您是对的,但指针不是引用变量,而不是保存变量本身吗?我假设传递一个指针变量并更改指针也会有效地更改原始变量。谢谢,我理解你所做的…但我想这让我意识到我可能有一个误解。我认为指针类似于Java中的引用变量;因此,当我传递参数“node*first”和“node*n”时,执行“first=n”不会改变指针吗?@AdnanZaman编辑:)这是我不知道的!哇,这让我过去犯过的很多错误现在变得更有意义了。这些错误似乎不再那么神秘了。我想这就是他们所谓的“传递值”的意思。非常感谢你!