为什么即使在函数 returns 之后,对单个指针所做的更改仍然存在

Why are the changes made to single pointer persists even after the function returns

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

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

returns ,为什么它所做的更改会保留在树中。

1.We 没有使用双指针

2.Nor是根全局

3.We 没有 return 地址

谁能解释为什么会这样?

代码

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);
}

调用:修改BSTUtil(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;
}

我们需要 return 插入函数的地址才能使更改永久化,为什么不 return 这里呢??

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

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

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