回头看两星编程文章不禁看不出下面两行区别的意义:
*curr = entry->next;
curr = &entry->next;
我能看到的唯一区别是第一行更改*curr
为指向下一个节点,第二行使一个全新的**
指向节点成员(这是下一个循环中的前一个节点)
我突然想到free
,在第一个 if 块中输入条目会阻止第二行在下一个循环中正常工作,但在这种情况下,为什么不在这两种情况下都使用第一行呢?是性能问题吗?
编辑:请阅读上面标题为“双星编程”的链接中的第二个代码块
编辑:所以我似乎解释得不好(对不起!)所以让我看看我是否可以更详细地解释一下。
这是文章中的源代码。
void remove_if(node ** head, remove_fn rm)
{
for (node** curr = head; *curr; )
{
node * entry = *curr;
if (rm(entry))
{
*curr = entry->next;
free(entry);
}
else
curr = &entry->next;
}
}
我认为这curr = &entry->next;
条线没有必要,您可以使用另一条线两次:
void remove_if(node ** head, remove_fn rm)
{
for (node** curr = head; *curr; )
{
node * entry = *curr;
if (rm(entry))
{
*curr = entry->next;
free(entry);
}
else
*curr = entry->next;
}
}
然后你可以将它移到 if 语句之上,并为自己节省几行:
void remove_if(node ** head, remove_fn rm)
{
for (node** curr = head; *curr; )
{
node * entry = *curr;
*curr = entry->next;
if (rm(entry))
{
free(entry);
}
}
}
实际上,看起来您根本不需要指针指针,并且可以这样做:
void remove_if(node * head, remove_fn rm)
{
for (node* curr = head; curr; )
{
node * entry = curr;
curr = entry->next;
if (rm(entry))
{
free(entry);
}
}
}
那么他们为什么采用第一种方式呢?表现?还有什么不为人知的?