当前位置:  技术问答>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...

本帖最后由 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;
    }  

高亮的两句有什么区别吗?真心的不懂指针了~

|
这两个只是1维与2维指针的区别。
前者传的是1维指针,所以必须得有返回头指针(1维指针没法修改指针实参本身,就像传值没法修改实参的值本身一样),并且还多了很多临界情况判断
后者传的是2维指针,所以不用返回值。代码也更

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

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • gcc编译CORBA程序如何关闭智能指针转换为普通指针的警告
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 指向类成员函数的指针其实并非指针
  • 谁说java没指针,我觉得全是指针才对
  • 深入解析C++中的指针数组与指向指针的指针
  • 一个用指针传递内存的问题(如果传进去的是三重指针确不行)
  • busybox中的gzip运行过程中出现page fault错误,并指出出错的指针,但是怎么使用gdb调试,找到指针对应的语句?
  • 关于free指针的指针分量
  • C语言中常量指针与指针常量区别浅析
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • C++中指向对象的常指针与指向常对象的指针详解
  • 关于指针变量,struct 变量,指针使用的一些疑惑,望高手指教
  • 深入理解数组指针与指针数组的区别
  • 深入解析函数指针与返回函数的指针
  • 指向变量的常指针与指向常变量的指针详细解析
  • 结构指针类型强制转换
  • 请问return语句会执行哪些操作?在函数中return一个已分配内存的指针,该指针所占用的内存会释放吗?
  • 请问如何在linux (redhat)下传递一维数组指针?
  • C:函数指针
  • 利用函数指针的好处是什么?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,