这是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;
}
我不需要代码,我只想理解为什么它不起作用预先感谢。
因为c按值调用。您不能更改函数内参数的值(例如head
),并期望呼叫者注意。
这确实应该是骗子,但我找不到它。
有两种基本方法来修复它:
- 返回新值或
- 将指针传递到该值,以便该函数可以对其进行修改。
如果可能的话,前者通常更干净。
那会这样:
struct node * add_last(struct node *head, struct node *new_node)
{
new_node->next = head;
return new_node;
}
在C语言参数中是通过Value 传递的,因此在函数副本中对指针进行的更改仅在函数主体中生效,此后更改了指针的副本从范围中删除,丢失。
如果要传递'参考'(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);
由于C是"按值"语言,因此语句head = ...;
仅在功能主体内生效。如果要更改头指针,则需要取消效果并分配给它。
尝试回答以下问题:
给定这些程序片段:
int foo(int a)
{
a = 1234;
}
...
int bar = 1;
foo(bar);
// what's the value of bar here
呼叫foo
后bar
的值是多少?
1或1234?