今天在http://www.csdn.net/article/2013-01-10/2813559-two-star-programming看到了linus关于指针的谈论,里面的两个例子,使我对我之前理解的指针产生了怀疑,于是又认真的玩起了二级指针。
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 }
上面的例子就是文章给出的一个关于二级指针的例子,文章给出的评论是,最关键的部分在于:链表中的链接都是指针,因此指针到指针是修改链表的首选方案。
我对作者的用法起初是不大理解,我想不大理解的根源是我对程序对堆栈的用法还不够深入了解。首先,采用一级指针最好是方便修改指针对象的值,采用二级指针最好是方便修改指针的值。理解了这两点,对上面的用法也就可以理解了,函数的用意是删除指定的链表节点,传统的用法是采用一级指针,传入链表头节点,然后判断删除的是头节点,还是其他节点,然后依次寻找一下一个节点。但是linus认为采用这种用法的人不懂指针,懂指针的人采用上面的做法。
分析一下上面的代码,有两行代码,第8行和第12行,这两行的用法确实高明,第8行改变指针的指向为下一个节点,不论是头节点还是其他节点都适用,第12行改变指针本身的指向为下一个节点,这个好处是不改变调用函数指针的指向。
关于二级指针还需要不断的研习。