当前位置: 技术问答>linux和unix
一篇关于指针的CSDN文章居然没看懂
来源: 互联网 发布时间:2017-03-29
本文导语: 本帖最后由 bluelion9527888 于 2013-01-15 17:13:55 编辑 对话Linus Torvalds:大多黑客甚至连指针都未理解 http://www.csdn.net/article/2013-01-10/2813559-two-star-programming “不懂指针”的开发者代码示例: typedef struct node { str...
http://www.csdn.net/article/2013-01-10/2813559-two-star-programming
“不懂指针”的开发者代码示例:
typedef struct node
{
struct node * next;
....
} node;
typedef bool (* remove_fn)(node const * v);
// Remove all nodes from the supplied list for which the
// supplied remove function returns true.
// Returns the new head of the list.
node * remove_if(node * head, remove_fn rm)
{
for (node * prev = NULL, * curr = head; curr != NULL; )
{
node * next = curr->next;
if (rm(curr))
{
if (prev)
prev->next = curr->next;
else
head = curr->next;
free(curr);
}
else
prev = curr;
curr = next;
}
return head;
}
Linus Torvalds提供的解决方案:
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;
}
}
高亮的两句有什么区别吗?真心的不懂指针了~
|
这两个只是1维与2维指针的区别。
前者传的是1维指针,所以必须得有返回头指针(1维指针没法修改指针实参本身,就像传值没法修改实参的值本身一样),并且还多了很多临界情况判断
后者传的是2维指针,所以不用返回值。代码也更
rm是指是否删除这个元素。 *curr = entry->next; 这句就是越过了*curr指向的元素,让*curr指下entry的下一个元素entry->next...因为是2维指针,所以修改了前一个结点的next域值。
当不用删除时,curr = &entry->next只是将curr移到后一个元素上。
链表,画个图就知道了。
前者传的是1维指针,所以必须得有返回头指针(1维指针没法修改指针实参本身,就像传值没法修改实参的值本身一样),并且还多了很多临界情况判断
后者传的是2维指针,所以不用返回值。代码也更
rm是指是否删除这个元素。 *curr = entry->next; 这句就是越过了*curr指向的元素,让*curr指下entry的下一个元素entry->next...因为是2维指针,所以修改了前一个结点的next域值。
当不用删除时,curr = &entry->next只是将curr移到后一个元素上。
链表,画个图就知道了。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。