在递归调用中给出指针参数

时间:2015-02-12 19:29:25

标签: c pointers

我有专家的简单指针问题。 此函数创建链接列表的副本。 最后一行,它是copyLinkedList的递归调用。 我无法弄清楚指针指向我放置的指针?

我怎样才能轻松理解这个复杂的指针呢? (对我来说仍然很难)

*谢谢*

void copyLinkedList(struct Node *node, struct Node **ppNode)
{
    if (node){
        *ppNode = new Node;
        (*ppNode)->data = node->data;
        (*ppNode)->next = NULL;
        copyLinkedList(node->next,  ?? );
    }
}

2 个答案:

答案 0 :(得分:1)

好吧,你想把指针传递给(*ppNode)->next

copyLinkedList(node->next, &(*ppNode)->next);

答案 1 :(得分:0)

将指针(单个)传递给函数时,它是按值传递的。所以,你基本上有一个传递给函数的指针的副本,如果你修改它,它不会改变传入的原始指针 - 调用者永远不会看到它。

如果传递指向指针的指针,则可以取消引用它,这样可以更改调用者传入的原始指针。

在你的情况下,* ppNode = new Node;为用户传入的指针指定一个新节点(即指向指针的指针指向)...我知道,这听起来很糟糕 - 但你可以把它画出来并且它是有意义的。

将新指针的数据和下一个值设置为原始列表中的值。现在你想继续下一个元素。因此,您将递归调用原始列表的下一个元素,以及您正在创建的新列表的下一个元素。所以,你想传入一个指向你刚刚创建的元素的“下一个”指针的指针。

  • 您刚创建的节点是* ppNode(取消引用指针)。
  • * ppNode之后列表中的下一个节点是->next成员。
  • 指向下一个成员的指针是您获取下一个成员的地址时获得的指示。

所以,&(*ppNode)->next - @StenSoft已经提供了完整的电话。