c - 当我阅读 bsd 4.4 的核心代码时,无法处理似乎不必要的指针

标签 c pointers bsd double-pointer pointer-to-pointer

我正在阅读《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/

相关文章:

c - nlist 函数始终返回 -1

c++ - Eclipse 无法链接到 kernel32.lib

c - 结构功能

c - 结构自引用

c++ - 对包含指针的结构进行 Qsort

linux - 带有 -i 选项的 sed 命令(就地编辑)在 Ubuntu 上运行良好,但在 Mac 上运行良好

c - "Variably modified ' 变量名 ' at file scope"大小在宏中定义

c++ - 谁负责C++中的栈和堆?

c++ - 在 C++ 中(不在 C 中)具有未指定边界的数组指针的可用情况

sockets - 使用BSD套接字模拟服务器负载