繁体   English   中英

c ++指针和指向引用的指针

[英]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传递给foovalue也没有更改。 为了解决让更改反映回调用者的问题,在C ++中传递引用 - 在上面的例子中,引用int ,在你的例子中是对Node*的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM