我写了一个函数,用于在单链表上实现合并排序,其中每个元素都有一个整数和下一个指针。 函数splitlist之一用于将给定的链表分为两个链表
void splitList(struct node* source, struct node** frontRef, struct node** backRef)
{
struct node *s, *f;
s = source;
f = s->next;
while(f && f->next)
{
s = s->next;
f = f->next->next;
}
*frontRef = source;
f = s->next;
s->next = NULL;
*backRef = f;
}
这里的source是指向给定链接列表的指针,而frontRef和backRef是需要通过此函数分配的指针的引用。 fronRef应该引用第一个链表,而backreef应该引用第二个链表。 这段代码给出了行分割错误
* frontRef =源; * backRef = f;
被替换为
frontRef =&source; backRef =&f;
我无法理解其原因,因为这两组语句彼此相等
答案 0 :(得分:9)
因为这两组语句彼此等效
他们绝对不是。
'The column of the last filled cell in the whole table
lastCol = ws.Cells.Find(What:="*", _
After:=Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
表示取消引用 *frontRef = source
并在类型为{{1}的返回的 lvalue 表达式上调用frontRef
}。
operator=
表示获取 node
的地址,然后将分配给frontRef = &source
。
如果source
未初始化或为null,则(1)是未定义的行为,但是(2)可以。
答案 1 :(得分:9)
*frontRef = source; *backreef = f;
和
frontRef = &source; backreef = &f;
不相同:
一个正确地将front
和back
分配给两个链接列表,一个不正确,这会导致分段错误。
答案 2 :(得分:3)
*frontRef = source; *backRef = f;
frontRef = &source; backRef = &f;
这些不是等效的。
第二个只是使用另一个局部变量frontRef
的地址更新了局部变量source
,因此对于调用方而言,它实际上没有任何影响。您可能将frontRef
设为out参数,但根本没有更新。 (与backRef
相同。)