2017-04-04 103 views
0

我正在阅读tcp/ip说明的v2并与本书中的一系列代码混淆。当我读取bsd的核心代码时,无法处理看似不必要的指针指针4.4

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; 

是吗?

+0

变量'p'是一个局部变量。如果你只有'struct ifnet * p',那么你只能修改该局部变量,并且一旦函数结束,这些变化就会丢失。通过使用指向指针的指针,改变'* p'将永久修改'p'指向的内容。在这种情况下,将节点添加到链接列表。 –

+0

非常感谢bro – WaldenShen

回答

0

作者使用了一个指向指针的指针,因为他们注意到了它们用于抽象的通用性。它是“通过链接遍历列表”而不是由节点遍历的。你很明显知道,如果你的链表数据结构被一个指针引用,那么你必须将一个指针指向你的函数,以防在头节点上发生插入或删除。否则,您将修改相关节点的内部指针。

但是,如果您通过地址引用这些内部节点指针,而不是通过它们所在的节点访问它们呢?那么,代码对于头节点和所有内部节点都是相同的。