在处理二叉树时,按值调用vs通过引用调用

时间:2012-06-07 12:39:15

标签: c binary-tree function-call

当我们想要在函数中改变普通变量的值时,我们使用call by reference传递它。但是当我们必须使用refence调用传递指针变量(如二叉树的节点)时,我无法理解复杂性。我知道如果我们想修改poiter变量以指向另一个节点,我们必须使用引用调用。但是如果我们必须修改根的数据元素呢?我认为要改变它,我们还需要通过参考调用。但是下面的代码片段给出了10,10,10的输出,即使我已经使用函数modifyTree中的值调用传递了树的根节点。我在这里错过了一些东西吗?

#include<stdio.h>
#include<stdlib.h>


struct node
{
int data;
struct node* left;
struct node* right;
};

/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
struct node* node = (struct node*)malloc(sizeof(struct node));

node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}

/*  This function sets the data fields of some of the nodes of tree to 10*/
void modifyTree(struct node* node)
{

node->data = 10;
node->left->data = 10;
node->right->data = 10;
}

int main()
{
struct node *root = newNode(1);
root->left            = newNode(2);
root->right          = newNode(3);
root->left->left     = newNode(4);
root->left->right   = newNode(5);

modifyTree(root);

printf("%d\n", root->data);
printf("%d\n", root->left->data);
printf("%d\n", root->right->data);

getchar();
return 0;
}

3 个答案:

答案 0 :(得分:3)

按值传递指针意味着被调用函数接收调用者使用的完全相同的指针值,因此通过该指针的任何访问都将引用相同的内存。

如果您希望函数修改调用者具有的指针 value ,则需要双指针(例如,通过分配新树,从而“创建”新的指针值)。

答案 1 :(得分:1)

您按值传递指针,但指针仍然指向同一个东西。我会用一些假设的价值来证明。

main中,您分配了一个新的struct node。假设它是在内存位置0x12345创建的。现在,您的struct node *root包含0x12345

您现在致电modifyTree(root);root已将按值传递给root的{​​{1}}参数。

modifyTree现在包含root它指向相同的内存位置。

因此,当您使用0x12345访问该位置时,您将访问在node->data = 10中创建的相同内存。

答案 2 :(得分:0)

您通过值yes传递指针,但您在modifyTree函数内更改的是指针指向的结构的元素。通过值将指针传递给struct不会阻止您更改参数指向的struct的内部内容。如果您正在更改指针本身,那么您将看到您期望的行为。