Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的双指针问题(下一个用单指针,上一个用双指针)_C_Pointers - Fatal编程技术网

C语言中的双指针问题(下一个用单指针,上一个用双指针)

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。使用上一个双指针的原因是什么 它不是指向上一个结构,就像下一个一样,它指向指向这

在mysql的表.h的代码中。有以下代码

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来执行此操作。指针可能会让你的头脑变得很复杂——对于这种情况,我建议你画一些方框图,然后进行删除操作。谢谢你的评论,下面的链接也有很好的解释。分享一下: