我正在使用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
传递指针也不例外。在函数中更改指针不会在调用函数中更改指针,因此您必须将指针传递给指针。这就是第二个代码示例工作的原因。