C语言中的双指针问题(下一个用单指针,上一个用双指针)
在mysql的表.h的代码中。有以下代码C语言中的双指针问题(下一个用单指针,上一个用双指针),c,pointers,C,Pointers,在mysql的表.h的代码中。有以下代码 typedef struct st_table_share { ... struct st_table_share * next, /* Link to unused shares */ **prev; 在教科书中,我们通常有 sometype *next, *prev; 但在这里它使用**prev而不是*prev。使用上一个双指针的原因是什么 它不是指向上一个结构,就像下一个一样,它指向指向这
typedef struct st_table_share
{
...
struct st_table_share * next, /* Link to unused shares */
**prev;
在教科书中,我们通常有
sometype *next, *prev;
但在这里它使用**prev而不是*prev。使用上一个双指针的原因是什么 它不是指向上一个结构,就像下一个一样,它指向指向这个结构的指针 这样做的好处是,它可以指向前面结构的“下一个”成员,也可以指向实际的头指针本身——如果这是列表中的第一项。这意味着在这两种情况下删除该项都涉及到*prev=next——没有更新头指针的特殊情况
缺点是你不能轻易地使用它来向后遍历结构;因此,它的真正设计目的是优化这样一种情况,即您只关心向前遍历,但希望轻松删除任意节点。它不是指向上一个结构,而是指向指向此结构的指针 这样做的好处是,它可以指向前面结构的“下一个”成员,也可以指向实际的头指针本身——如果这是列表中的第一项。这意味着在这两种情况下删除该项都涉及到*prev=next——没有更新头指针的特殊情况
缺点是你不能轻易地使用它来向后遍历结构;因此,它的真正目的是优化这样的情况,即您只关心向前遍历,但希望轻松删除任意节点。它不是您提到的双指针。相反,它被称为取消引用
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
}
这不是你提到的双指针。相反,它被称为取消引用
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
}
也许如果你检查一下它在代码中的使用位置,你会看到为什么…也许如果你检查一下它在代码中的使用位置,你会看到为什么…这对我真的很有帮助。但我还是不太明白:这意味着删除项在这两种情况下都涉及*prev=next-更新头指针没有特殊情况,定义*prev not**prev时与prev=next有什么不同吗?如果将prev定义为常规指针,然后prev=next只需将此结构中的prev指针设置为指向下一个结构-它不会更改任何有用的内容。但是,当您从列表中删除一个项目时,您需要更新上一个结构中的“下一个”指针,以跳过此结构,指向此结构的下一个。对于常规的单-*指针,您可以使用prev->next=next来执行此操作。指针可能会让你的头脑变得很复杂——对于这种情况,我建议你画一些方框图,然后进行删除操作。谢谢你的评论,下面的链接也有很好的解释。分享吧:这对我真的很有帮助。但我还是不太明白:这意味着删除项在这两种情况下都涉及*prev=next-更新头指针没有特殊情况,定义*prev not**prev时与prev=next有什么不同吗?如果将prev定义为常规指针,然后prev=next只需将此结构中的prev指针设置为指向下一个结构-它不会更改任何有用的内容。但是,当您从列表中删除一个项目时,您需要更新上一个结构中的“下一个”指针,以跳过此结构,指向此结构的下一个。对于常规的单-*指针,您可以使用prev->next=next来执行此操作。指针可能会让你的头脑变得很复杂——对于这种情况,我建议你画一些方框图,然后进行删除操作。谢谢你的评论,下面的链接也有很好的解释。分享一下: