我正在学习 C 编程中指针的概念。我写了一个如下函数来交换双向链表中的两个相邻节点;
void swapNode(DLListNode *a, DLListNode *b)
{
DLListNode *temp = a;
a->value = b->value;
b->value = temp->value;
}
并且它不起作用,因为 b
的值成功传递到 a
上,但是 a
的值没有传递到 b
上。然后我发现如果我像这样写代码,它就可以工作。有人可以向我解释一下区别吗?非常感谢。
void swapNode(DLListNode *a, DLListNode *b)
{
DLListNode temp = *a;
a->value = b->value;
b->value = temp.value;
}
答案 0 :(得分:0)
第一个版本不复制 a
指向的值。它只是创建对 a
已经引用的内容的第二个引用。当 a->value
获得新值时,这当然是 temp->value
获得新值的同义词。
在第二个版本中,您创建了一个 节点,它从 a
引用的内容中获取其属性。所以在这里您做复制一个 value
属性(以及 next
和 prev
属性)。现在,当 a->value
更改时,temp
与该更改无关,因此 temp.value
仍然是分配给 a->value
之前的值。而这正是您成功交换所需要发生的事情。
甚至可以只复制value
属性值,而不是节点(它还有其他属性,如prev
和next
) , 因为你真的只需要一份 value
;没有别的(我在这里假设 value
是一个 int
):
void swapNode(DLListNode *a, DLListNode *b)
{
int value = a->value;
a->value = b->value;
b->value = value;
}