这是c语言代码:
struct node
{
int num;
struct node* next;
};
void add_last(struct node* head,struct node* new_node)
{
new_node->next=head;
head=new_node;
}
我不需要代码,我只想了解为什么这不起作用 提前谢谢。
答案 0 :(得分:1)
因为C是按值调用的。您无法在函数内更改参数的值(如head
),并期望调用者注意。
这应该是一个骗局,但我找不到它。
有两种基本方法可以修复它:
如果可能的话,前者通常更清洁。
这样就可以了:
struct node * add_last(struct node *head, struct node *new_node)
{
new_node->next = head;
return new_node;
}
答案 1 :(得分:1)
在c语言参数按值传递,因此函数对此指针副本所做的更改仅在函数体中生效,之后从范围中删除指针的更改副本并且丢失了。
如果你想传递'引用'(c不支持像c++这样的实际引用)并修改这个指针,你必须传递指向你要修改的指针,比如
struct node * add_last(struct node **head, struct node *new_node)
// ^^
{
new_node->next = head;
head=new_node;
}
// Calling
add_last(&head, new_node);
第二个机会是返回此指针
struct node * add_last(struct node *head, struct node *new_node)
{
new_node->next = head;
return new_node;
}
// Calling
head = add_last(head,new_node);
答案 2 :(得分:0)
由于C是“按值传递”语言,因此语句head = ...;
仅在函数体内生效。如果你想改变头部指针,你需要解除引用并分配它。
答案 3 :(得分:0)
尝试回答以下问题:
鉴于这些程序片段:
int foo(int a)
{
a = 1234;
}
...
int bar = 1;
foo(bar);
// what's the value of bar here
调用bar
之后foo
的价值是什么?
1或1234?