在mysql的table.h
代码中。有以下代码
typedef struct st_table_share
{
...
struct st_table_share * next, /* Link to unused shares */
**prev;
在教科书中,我们通常有
sometype *next, *prev;
但是在这里它使用**prev
而不是*prev
。为prev
使用双指针的原因是什么?
答案 0 :(得分:5)
它没有指向前一个结构,因为接下来是,它指向指向此结构的指针。
这样做的好处是它可以指向前一个结构的“下一个”成员,或者它可以指向实际的头指针本身 - 在这是列表中的第一个项目的情况下。这意味着在两种情况下删除项目都涉及“* prev = next” - 更新头指针没有特殊情况。
缺点是你不能(轻松地)使用它来向后穿过结构;所以它的设计目的是优化您只关心遍历前进但希望轻松删除任意节点的情况。
答案 1 :(得分:0)
你提到的不是“双指针”。相反,它被称为“取消参考”。
int x = 10;
int* prev = &x;
* prev是变量x的地址。
现在假设您需要将指针变量prev的地址传递给另一个名为foo的函数,该函数接受指针的地址作为其参数(指向指针的指针)。
void function foo(int** ptr)
{
prinft("%p", ptr); //this would print the address of prev
printf("%p", *ptr); //this would print the value (the address of x) contained inside address contained inside ptr.
printf("%d", **ptr); //this would print the value (the value of x, 10) contained at the address(address of x) contained inside address (address of prev) contained inside ptr
}