这个 struct node **p 在做啥?

Posted

技术标签:

【中文标题】这个 struct node **p 在做啥?【英文标题】:what does this struct node **p is doing?这个 struct node **p 在做什么? 【发布时间】:2021-11-22 00:13:05 【问题描述】:

我正在学习数据结构,这里有一个我无法理解的东西......

int end(struct node** p, int data)
    /*
    This is another layer of indirection. 
    Why is the second construct necessary? 
    Well, if I want to modify something allocated outside of my function scope,
    I need a pointer to its memory location. 
    */
    
    struct node* new = (struct node*)malloc(sizeof(struct node));
    struct node* last = *p;
    new->data = data;
    new->next = NULL;
    while(last->next !=NULL)
        last = last ->next ;
    
    last->next = new;

    为什么我们使用 struct node **p? 我们可以使用 struct node *p 代替 struct node **p 吗? 我在这里写的评论是我在这里找到的答案,但是我仍然不清楚这里是完整的代码...

请帮帮我 谢谢

【问题讨论】:

这能回答你的问题吗? Why use double indirection? or Why use pointers to pointers? 您确定您正确复制了此代码吗?事实上,这似乎是错误的。而且..因为它不需要双指针。我认为类似:if (*p == NULL) ... 不见了。 这不是一个完整的代码它只是我感到困惑的功能 以防万一您不知道:添加信息和澄清问题的最佳方法是edit您的问题。例如。做我的回答评论中讨论的事情。 顺便说一句,你只能接受一个问题(我看到你先接受了我的问题,然后是另一个)。您可以选择对您最有帮助的一个,这就是它的重点。我仅在您认为“勾号”表示“适用/正确”的情况下才提及这一点。它的意思是“最有帮助的答案”。有时很难选择。见***.com/help/someone-answers你根据个人意见选择。对我好。 :-) 【参考方案1】:

简短回答:发布的代码中不需要双指针。

传递双指针的正常原因是您希望能够在调用者范围内更改变量的值。

例子:

struct node* head = NULL;
end(&head, 42);
// Here the value of head is not NULL any more
// It's value was change by the function end
// Now it points to the first (and only) element of the list

你的函数应该包括这样一行:

if (*p == NULL) *p = new; return 0;

但是,您的代码没有!也许这真的是您的代码中的错误?

由于您的代码没有更新*p,因此没有理由传递双指针。

顺便说一句:您的函数说它将返回int,但代码没有return 语句。这肯定是个错误。

【讨论】:

是的,我遇到了一些错误,感谢您的帮助【参考方案2】:

显示的函数(根据其名称)应该创建一个新节点并将其附加到由指向该列表节点的指针表示的列表的末尾。 (但我怀疑它确实如此,同意 cmets...)

由于列表可能为空并且指向节点的指针因此不指向现有节点,因此有必要能够潜在地将指向该列表的第一个元素的指针从 NULL 更改为然后指向新的创建节点。

只有当参数不仅是指向第一个节点的指针的副本,而是指向第一个节点的指针时,这才是可能的。因为在第二种情况下,您可以取消引用指向指针的指针并实际修改指向节点的指针。

否则列表(如果为 NULL)在函数调用后仍将始终指向 NULL。

【讨论】:

虽然这在“正常情况”下是正确的,但在这里并不适用,因为发布的代码不会检查*p == NULL @4386427 是的,显示的代码没有按应有的方式执行。这就是为什么我提到预期的功能(正如名称和使用** 参数的事实所暗示的那样)并声明我不显示代码。所问的问题“这个结构节点**p在做什么?”和 1. 和 2. 我回答。 这不是完整的代码,我应该分享完整的代码 *** 从不想要“完整代码”(至少在所有情况下都不需要)。这里值得赞赏的是提供minimal reproducible example 的问题。在这种情况下(如果我正确阅读了您的问题),需要澄清的是,您知道该函数(尚未)在所有情况下都按预期(我的猜测/假设)起作用,但您不是询问如何解决这个问题,而只是想解释**pointer 构造的含义和工作原理。如果我确实误读了任何内容,请澄清并指出我的误解。 我的荣幸。在 *** 上玩得开心。在您方便的时候,请拨打tour,您可能会发现How to Ask 的信息对您有帮助。

以上是关于这个 struct node **p 在做啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个函数在做啥

这段代码在做啥?

这个@synthesize 语句在做啥?

调试这个 LISP 病毒在做啥

这个 C++ 强制转换代码在做啥?

这个 express 变量在做啥?