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

时间:2015-02-19 08:14:51

标签: c pointers tree

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

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

后的疑问

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

1.我们没有使用双指针

2.Nor是根本全球

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

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

2 个答案:

答案 0 :(得分:3)

这是有效的,因为在此示例中,节点之间的链接不会更改。只保存它们存储的值(->data)。

答案 1 :(得分:0)

在函数中没有任何神圣的东西阻止对外界产生持久影响,唯一的限制是它接收的参数可能会限制它可能访问的数据。

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