当我们想要在函数中改变普通变量的值时,我们使用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;
}
答案 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的内部内容。如果您正在更改指针本身,那么您将看到您期望的行为。