0

当我们想在函数中更改普通变量的值时,我们使用按引用调用来传递它。但是当我们必须使用引用调用传递指针变量(如二叉树的节点)时,我无法理解其中的复杂性。我知道如果我们想修改指针变量以指向另一个节点,我们必须使用引用调用。但是如果我们必须修改根的数据元素怎么办。我认为要更改它,我们也需要通过引用进行调用。但是下面的代码片段给出了 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;
}
4

3 回答 3

3

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

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

于 2012-06-07T12:43:39.917 回答
1

您正在按值传递指针,但指针仍然指向同一事物。我将使用一些假设值来演示。

main你分配一个新的struct node. 假设它是在内存位置创建的0x12345。所以现在你的struct node *rootcontains 0x12345

你现在打电话modifyTree(root);按值root传递给 的参数。rootmodifyTree

现在root包含0x12345. 它指向同一个内存位置。

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

于 2012-06-07T12:44:25.683 回答
0

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

于 2012-06-07T12:45:45.957 回答