首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

一篇关于指针的CSDN稿件居然没看懂

2013-01-23 
一篇关于指针的CSDN文章居然没看懂本帖最后由 bluelion9527888 于 2013-01-15 17:13:55 编辑对话Linus Tor

一篇关于指针的CSDN文章居然没看懂
本帖最后由 bluelion9527888 于 2013-01-15 17:13:55 编辑 对话Linus Torvalds:大多黑客甚至连指针都未理解
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;
    }  

高亮的两句有什么区别吗?真心的不懂指针了~
C linux C++
[解决办法]
这两个只是1维与2维指针的区别。
前者传的是1维指针,所以必须得有返回头指针(1维指针没法修改指针实参本身,就像传值没法修改实参的值本身一样),并且还多了很多临界情况判断
后者传的是2维指针,所以不用返回值。代码也更



rm是指是否删除这个元素。 *curr = entry->next; 这句就是越过了*curr指向的元素,让*curr指下entry的下一个元素entry->next...因为是2维指针,所以修改了前一个结点的next域值。
当不用删除时,curr = &entry->next只是将curr移到后一个元素上。
链表,画个图就知道了。

热点排行