Linus Torvalds:大多黑客甚至连指针都未理解

简介: 几周前, Linus Torvalds在Slashdot上回答了一些问题。其中有一条引发了开发者们的强烈关注,当被问到他心目中的内核黑客时,他说自己这些日子已经不怎么 看代码了,除非是帮别人审查。
几周前, Linus Torvalds在Slashdot上回答了一些问题。其中有一条引发了开发者们的强烈关注,当被问到他心目中的内核黑客时,他说自己这些日子已经不怎么 看代码了,除非是帮别人审查。他稍微暂停了一下,坦言那些“狡猾”的通过文件名查找高速缓存又抱怨自己能力一般的内核“恶魔”(黑客)才是他欣赏的。

他说:

    相反,很多人连低水平的内核编程都还没学好。像lockless用名字查找(name lookup)功能即使不大也不复杂,却是指针到指针的一个简单及良好的使用方法。比如,我曾看见过许多人通过跟踪上一页条目删除一个单向链接的列表项,然后删除该条目。例如:
  1.     if (prev)  
  2.         prev->next = entry->next;  
  3.     else  
  4.         list_head = entry->next;
复制代码
每当我看到这些的代码,我会说:“此人不了解指针”。这还是一个可悲的、常见的问题。

    如果开发者能够理解指针,只需要使用“指向该条目的指针”并初始化list_head,然后贯穿列表,此时无需使用任何条件语句即可删除该条目,只需通过 *pp = entry->next。

我想我理解指针,但不幸的是,如果要实现删除函数,我会一直保持跟踪前面的列表节点。这里是代码草稿:

不理解指针的人做法:
  1.     typedef struct node  
  2.     {  
  3.         struct node * next;  
  4.         ....  
  5.     } node;  
  6.      
  7.     typedef bool (* remove_fn)(node const * v);  
  8.      
  9.     // Remove all nodes from the supplied list for which the   
  10.     // supplied remove function returns true.  
  11.     // Returns the new head of the list.  
  12.     node * remove_if(node * head, remove_fn rm)  
  13.     {  
  14.         for (node * prev = NULL, * curr = head; curr != NULL; )  
  15.         {  
  16.             node * next = curr->next;  
  17.             if (rm(curr))  
  18.             {  
  19.                 if (prev)  
  20.                     prev->next = curr->next;  
  21.                 else  
  22.                     head = curr->next;  
  23.                 free(curr);  
  24.             }  
  25.             else  
  26.                 prev = curr;  
  27.             curr = next;  
  28.         }  
  29.         return head;  
  30.     }
复制代码
这个链表很简单,但可以把每个节点的指针和sentinel值构建成了一个完美的结构体,但是修改这个表的代码需要很精妙。难怪链表功能会常出现在许多面试环节中。

上面执行的代码是处理从列表头中删除任何节点所需的条件。

现在,让我们好好记住Linus Torvalds执行代码。在这种情况下,我们通过一个指针指向列表头来贯穿列表遍历修改。

Two star programming:
  1.     void remove_if(node ** head, remove_fn rm)  
  2.     {  
  3.         for (node** curr = head; *curr; )  
  4.         {  
  5.             node * entry = *curr;  
  6.             if (rm(entry))  
  7.             {  
  8.                 *curr = entry->next;  
  9.                 free(entry);  
  10.             }  
  11.             else  
  12.                 curr = &entry->next;  
  13.         }  
  14.     }
复制代码
好多了!最关键的部分在于:链表中的链接都是指针,因此指针到指针是修改链表的首选方案。

改进版的remove_if()是一个使用双重星号的例子,双重星号象征着两重间接寻址,再加一个星(third star)又会太过多余。

英文出自:Wordaligned

http://www.csdn.net/article/2013 ... wo-star-programming
目录
相关文章
|
编译器 Go 开发工具
Linus:利用二级指针删除单向链表
感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图) Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding。 下面是Linus的教学原文及翻译—— "At the oppo
1548 0
|
4月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
24天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
2月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
2月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
2月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
|
3月前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
|
3月前
|
存储 C语言
【C语言初阶】指针篇—上
【C语言初阶】指针篇—上
|
4月前
|
搜索推荐 程序员 C语言
指针赋值与引用传递:C语言的基础知识与实践技巧
指针赋值与引用传递:C语言的基础知识与实践技巧
|
4月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)