C-任何人都可以告诉我为什么此功能不会添加last的节点,以及我该如何解决



这是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

呼叫foobar的值是多少?

1或1234?

最新更新