为什么将 **head 发送到函数在反转 SLL 时有效,而 * head 在 C 中不起作用?

  • 本文关键字:head 有效 不起作用 SLL 函数 c
  • 更新时间 :
  • 英文 :


我正在使用Apple Clang 11.00编译我的代码以反转链表。我一开始使用此代码,但它不起作用:

void reverseSLL(node *head)
{
node *cur, *next, *prev;
cur = head;
prev = next = NULL;
if (head == NULL) {
printf("SLL does not Exist.n");
return;
}
while (cur != NULL) {
next =  cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
head = prev;
}

然后我切换到这个,它起作用了:

void reverseSLL(node **head)
{
node *cur, *next, *prev;
cur = *head;
prev = next = NULL;
if (*head == NULL) {
printf("SLL does not Exist.n");
return;
}
while (cur != NULL) {
next =  cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
*head = prev;
}

我不明白为什么会这样。有人可以帮忙吗?

C 中函数的参数是按值传递的,这意味着函数主体中对参数值所做的更改在函数返回后将不起作用。一个简单的例子:

void foo(int a)
{
a += 10;
}
int main()
{
int b = 0;
printf("before: %dn", b);
foo(b);
printf("after: %dn", b);
return 0;
}

这将打印:

before: 0
after: 0

如果你想让调用函数(在本例中main(看到更新的值,你必须传递一个指向int的指针(你也可以返回更新的值,但我们在这里会忽略它(:

void foo(int *a)
{
*a += 10;
}
int main()
{
int b = 0;
printf("before: %dn", b);
foo(&b); /* Note that we are taking the address of 'b' here */
printf("after: %dn", b);
return 0;
}

在这种情况下,我们的输出将是:

before: 0
after: 10

传递指针也不例外。在函数中更改指针不会在调用函数中更改指针,因此您必须将指针传递给指针。这就是第二个代码示例工作的原因。

相关内容

最新更新