[英]c++ pointers and pointer to a reference
我试图创建一个二进制搜索树。 我已经使用递归过程将节点插入树中。 代码如下。
void BST :: insertRoot(Node* node, int data) {
if (node == NULL)
this -> root = new Node(data);
else
insertOthers(node, data);
}
void BST :: insertOthers(Node* node, int data) {
if(node == NULL) {
node = new Node(data);
return;
}
if(data < node->getData())
insertOthers(node->getLeft(), data);
else
insertOthers(node->getRight(), data);
}
在此代码中,只有一个节点插入树中,然后连接断开。 然而,当我将Node*
更改为Node*&
它完美无缺。 我仍然无法理解这两者之间的区别。 谁能用内存映射解释这两者之间的区别? 谢谢
如果按值获取指针参数:
Node* node
然后修改它:
node = new Node(data);
将改变函数内的局部变量; 但不是来电者的论点。 这个新值将丢失,树将保持不变。
通过引用传递(这是对指针的引用,而不是指向引用的指针):
Node*& node
表示local参数指向与调用者参数相同的指针,因此调用者将看到对新值的更改。 因此,假设逻辑的其余部分是正确的,这将更新树中的指针以指向新节点,如您所愿。
符号Node*
表示'指向Node
的指针',第二个Node*&
表示'对指向Node
的指针'。 区别在于第一个给出了地址的副本,并且不允许就地更改指针,这样调用者可以看到效果。
按值传递指针时,函数会接收指针的副本作为参数。 您无法修改函数中的原始指针,因为您只能访问该副本。
通过引用传递指针时,可以通过引用修改原始指针。 这似乎是你的意图,否则你会泄漏分配的节点。
它可能基于意见,但为了更好的可读性,我会声明你的函数: Node* BST::insertOthers(int data)
并返回指向已分配节点的指针。
指针是一个整数值。 当你通过值,int,double,float, 指针等传递任何东西时,该函数将处理一个副本。 对副本的更改不会中继回调用方。
简而言之,您的问题与此无异:
void foo(int x)
{
x = 10;
}
int main()
{
int value = 0;
foo(value);
// value is still 0 after the call, not 10
}
请注意,即使将value
传递给foo
, value
也没有更改。 为了解决让更改反映回调用者的问题,在C ++中传递引用 - 在上面的例子中,引用int
,在你的例子中是对Node*
的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.