【问题标题】:Why are the changes made to single pointer persists even after the function returns为什么即使在函数返回后对单指针所做的更改仍然存在
【发布时间】:2015-02-19 08:14:51
【问题描述】:

我正在阅读以下文章。 Add greater values of every node

所以我对函数void modifyBSTUtil(struct node *root, int *sum)的疑问

returns ,为什么它所做的更改会持续存在于树中。

1.我们没有使用双指针

2.根也不是全局的

3.我们不返回地址

谁能解释为什么会这样??

代码

void modifyBSTUtil(struct node *root, int *sum)
{
    // Base Case
    if (root == NULL)  return;

    // Recur for right subtree
    modifyBSTUtil(root->right, sum);

    // Now *sum has sum of nodes in right subtree, add
    // root->data to sum and update root->data
    *sum = *sum + root->data;
    root->data = *sum;

    // Recur for left subtree
    modifyBSTUtil(root->left, sum);
}

调用 : modifyBSTUtil(root, &sum)

插入函数

struct node* insert(struct node* node, int data)
{
    /* If the tree is empty, return a new node */
    if (node == NULL) return newNode(data);

    /* Otherwise, recur down the tree */
    if (data <= node->data)
        node->left  = insert(node->left, data);
    else
        node->right = insert(node->right, data);

    /* return the (unchanged) node pointer */
    return node;
}

我们需要在插入函数的情况下返回地址以使更改永久化,为什么不在这里返回??

【问题讨论】:

  • 也许指针在函数内部被取消引用。
  • 你能给我们一个minimal complete exampole吗? (我真的应该有那个热键。)
  • 你没有修改树结构;您正在修改已经存在的节点。您只需要一个根节点地址即可。

标签: c pointers tree


【解决方案1】:

这是有效的,因为在这个例子中节点之间的链接没有改变。只有它们存储的值 (-&gt;data)。

【讨论】:

    【解决方案2】:

    函数中没有什么神圣的东西可以防止对外部世界产生持久影响,唯一的限制是它接收的参数可能会限制它可以访问的数据。

    在这种情况下,它获取一个指向节点的指针,并使用它来访问该节点并更改那里的数据。它不会更改指针本身,因为它是由值给出的(即 - 指针值被复制,因此更改它不会在外部可见),但指针值足以访问该节点的内存并更改存储的值那里。 请注意,访问节点本身可以​​让您更改那里的指针,因此可以在该节点下方的任何位置更改树结构。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多