为什么即使在函数 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
).
阻止对外界产生持久影响的函数没有什么神圣的,唯一的限制是它接收的参数可能会限制它可以访问的数据。
在本例中,它获取指向节点的指针,并使用它来访问节点并更改那里的数据。它不会更改指针本身,因为它是由值给出的(即 - 指针值被复制,因此更改它不会在外部可见),但指针值足以访问该节点的内存并更改存储的值那里。
请注意,访问节点本身可以让您更改那里的指针,因此可以更改该节点 下方 任何位置的树结构。
我正在阅读以下文章。 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
).
阻止对外界产生持久影响的函数没有什么神圣的,唯一的限制是它接收的参数可能会限制它可以访问的数据。
在本例中,它获取指向节点的指针,并使用它来访问节点并更改那里的数据。它不会更改指针本身,因为它是由值给出的(即 - 指针值被复制,因此更改它不会在外部可见),但指针值足以访问该节点的内存并更改存储的值那里。 请注意,访问节点本身可以让您更改那里的指针,因此可以更改该节点 下方 任何位置的树结构。