为什么Linux使用这个“指针指针”列表?

时间:2012-11-18 08:00:11

标签: c linux kernel

#define TAILQ_ENTRY(type)                       \
struct {                                \
    struct type *tqe_next;  /* next element */          \
    struct type **tqe_prev; /* address of previous next element */  \
}

我发现上面的代码使用指向指针的指针,而这不是唯一的代码。我想知道为什么这样做?指针本身无法处理它?<​​/ p>

1 个答案:

答案 0 :(得分:5)

我想这里的重点是删除元素。假设您有一个singly linked list,这意味着您可以转发在整个节点中导航。

现在考虑要删除的通用列表节点(比如N_j)。删除后,您希望轻松将上一个节点(比如N_{j-1})链接到 next (比如说N_{j+1})。因此,您需要修改前一个节点tqe_next的字段N_{j-1},该字段需要指向它的指针,即{em>指向 tqe_prev的指针N_j }}。

换句话说,在伪代码术语中,以下内容为真

 *(N_j.tqe_prev) ==  (N_{j-1}).tqe_next

 N_j.tqe_prev ==  &(N_{j-1}).tqe_next