【问题标题】:c++ pointers and pointer to a referencec++ 指针和指向引用的指针
【发布时间】:2015-02-13 18:03:52
【问题描述】:

我正在尝试创建一个二叉搜索树。我使用递归过程将节点插入树中。代码如下。

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*&amp; 时,它可以完美运行。我仍然无法理解这两者之间有什么区别。谁能用他们的内存映射来解释这两者之间的区别?谢谢

【问题讨论】:

  • 你和另一个问题I answered recently有同样的问题。最大的区别是那是 C,这是 C++。因此,一种方法(可能不是最好的)是传递对指针的引用,就像您对 Node*&amp; 所做的那样。
  • Node* 是一个单独的指针值,独立于所有其他变量。 Node*&amp; 是对其他地方的另一个指针的引用;例如,将其更改为指向另一个对象也会改变所指对象。

标签: c++ pointers data-structures binary-search-tree


【解决方案1】:

符号Node* 表示“指向Node 的指针”,第二个Node*&amp; 表示“引用指向Node 的指针”。不同之处在于第一个为您提供了地址的副本,并且不允许就地更改指针以使调用者可以看到效果。

【讨论】:

  • 我认为如果 Node*&amp; 被表述为“引用指向 Node 的指针”会更容易理解。
  • 我改了;这个话题确实有点繁琐(如果这是一个词的话),这是可以预料的。
【解决方案2】:

如果按值取指针参数:

Node* node

然后修改它:

node = new Node(data);

将改变函数内的局部变量;但不是调用者的论点。这个新值将丢失,而树将保持原样。

通过引用传递(这是对指针的引用,而不是对引用的指针):

Node*& node

表示本地参数引用与调用者参数相同的指针,因此调用者将看到更改为新值。因此,假设其余逻辑是正确的,这将根据需要更新树中的指针以指向新节点。

【讨论】:

    【解决方案3】:

    当您按值传递指针时,函数接收指针的副本作为参数。您不能修改函数内的原始指针,因为您只能访问副本。

    通过引用传递指针时,可以通过引用修改原始指针。这似乎是您的意图,否则您会泄漏分配的节点。

    它可能基于意见,但为了更好的可读性,我会这样声明你的函数:Node* BST::insertOthers(int data) 并返回指向分配节点的指针。

    【讨论】:

      【解决方案4】:

      指针是一个整数值。当您通过值、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。为了解决将更改反映回调用者的问题,在 C++ 中,您传递一个引用——在上述情况下,是对 int 的引用,在您的情况下,是对 Node* 的引用。

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2022-01-07
        相关资源
        最近更新 更多