【发布时间】:2015-07-18 19:12:01
【问题描述】:
我正在创建一个在二叉树中插入元素的函数,首先,我在 Visual Studio 2012 上执行了以下操作:
void Insert(Nodo *root, int x){
if(root == NULL){
Nodo *n = new Nodo();
n->value = x
root = n;
return;
}
else{
if(root->value > x)
Insert(&(root)->left, x);
else
Insert(&(root)->right, x);
}
}
但同样的代码在 Dev-C++ 中不起作用,我需要使用 Pointer of Pointer 才能使其工作,如下所示:
void Insert(Nodo **root, int x){
if(*root == NULL){
Nodo *n = new Nodo();
n->value = x
*root = n;
return;
}
else{
if((*root)->value > x)
Insert(&(*root)->left, x);
else
Insert(&(*root)->right, x);
}
}
有人知道为什么会这样吗?
【问题讨论】:
-
但是为什么它在 Visual Studio 中工作?我可以插入和搜索所有元素
-
如果是这样,它这样做只是因为您在调用者端使用非空地址启动了
root(您的帖子中不方便地缺少该代码以及节点定义)到有效的Node。即使这样,如果left和right是Nodo*,那么&(root)->left应该是Nodo**,并且该调用甚至不应该编译。或许,当它神奇地编译时,您是否在 same 源文本中有 both 这两个实现,如果是这样,您是否考虑过第一个可能通过重载解析调用第二个关于那些递归? -
我为第一条评论中的
int*和int**道歉,它们应该分别是Nodo*和Nodo**。漫长的一天。无论如何,see broken code here. -
因为要修改的是指针本身;不仅仅是它指向的东西。尽管数组(当作为参数传递时表示为指向第一个元素的指针)和 C++ 引用,C/C++ 中的所有参数都是按值传递的。也就是说,传递
Node*传递地址in 的指针。这还不够好。您需要指针的地址,以便可以修改指针本身。否则,它与传递int x、调用foo(n)并期望n在调用方修改回没有什么不同。 -
我试图解析那句话,但你的第一个代码只是改变了局部变量
root的值(它只是一个局部变量;也许那是您没有看到的断开连接),它最初只是保存您传入的任何内容的 值。该更改不会影响值 来自的位置呼叫者,召集者。如果您想在 C-fashion 中按地址修改某些东西(就是这样),那么您需要传递 您要修改的东西的地址,将参数声明为指向类型的指针并取消引用要保存到的指针。
标签: c++ pointers visual-studio-2012 pass-by-reference dev-c++