我正在阅读《tcp/ip 图解 v2》,并对书中的一系列代码感到困惑。
struct ifnet{
struct ifnet * if_next;
……
}
这里是该结构的背景信息,可以帮助您更多地了解该问题
void if_attach(struct ifnet* ifp){
struct ifnet **p = &ifnet;
while(*p):
p = &((*p)->if_next);
*p = ifp;
为什么作者在这个地方使用了指向指针的指针?我保证在剩余的文本中 p 永远不会再出现(这意味着它根本不会用作任何函数的参数)。
在我看来,这段代码可以转换成这样
struct ifnet *p = ifnet;
while(p):
p = *p->if_next;
p = ifp;
是吗?
最佳答案
作者使用了指向指针的指针,因为他们注意到他们利用了抽象的共性。它是“通过链接遍历列表”而不是通过节点。
您显然知道,如果您的链表数据结构是由指针引用的,那么您必须将指向该指针的指针传递到您的函数中,以防插入或删除发生在头节点上。否则,您将修改相关节点的内部指针。
但是,如果您也通过地址引用这些内部节点指针,而不是通过它们所在的节点来访问它们,该怎么办?那么,头节点和所有内部节点的代码就变得相同了。
关于c - 当我阅读 bsd 4.4 的核心代码时,无法处理似乎不必要的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43209179/