【问题标题】:pointer and reference both in arguments参数中的指针和引用
【发布时间】:2012-03-22 18:34:37
【问题描述】:

我在几个树代码中看到树类的函数同时具有 * 和 & 与节点 例如在 BST 中插入一个节点,函数是这样的

insertnode(node * &t,string value)
{
t = new node; t-> val = value 
// code to find right place in BST
}

我想知道为什么我们通常会传递对指针的引用,尤其是这种情况。如果有其他情况,还请指出,谢谢

而不是发布另一个问题。 有人还可以指出对象类的使用吗?我的意思是使用对象类的实例是否为所有子类分配了所有内存?即 int float 等。

【问题讨论】:

    标签: c++ c pointers pass-by-reference


    【解决方案1】:

    这意味着函数可以修改指针(即改变它指向的位置)。

    【讨论】:

    • 在这种情况下,即递归地尝试找到插入节点的正确位置,它是如何工作的
    【解决方案2】:

    指针与任何其他变量一样,都是按值传递的,除非您指定要通过引用传递它。

    void foo(int* x)
    {
       x = new int[1];
    }
    
    void goo(int*& x)
    {
       x = new int[1];
    }
    
    int* x = NULL;
    foo(x);
    //x is NULL here, and you also have a memory leak
    goo(x);
    //x points to an array of 1 int
    

    在您的情况下,您传递对指针的引用是因为您想修改原始指针。修改指针并不意味着改变它指向的值,而是改变它指向的地址。

    【讨论】:

    • 好的,我明白了我的情况,谢谢,还有 1 件事在 foo 中内存泄漏如何?
    • @sparkling_spark 您丢失了指向新分配内存的指针。函数返回后无法释放x
    【解决方案3】:

    通过引用传递指针使函数能够直接更改指针。在这种特殊情况下,它使指针指向新创建的node

    【讨论】:

      【解决方案4】:

      通过传递对指针的引用,这意味着您可以修改指针。

      这里有一个例子: http://msdn.microsoft.com/en-us/library/1sf8shae%28v=vs.80%29.aspx

      【讨论】:

        【解决方案5】:

        当你声明这样的函数时:

        foo(node* param);
        

        param 实际上是一个按值传递的指针..所以你有一个该指针的副本..

        如果你传递一个参数:

        foo(node*& param);
        

        你所拥有的是一个通过引用传递的指针,所以你有一个指针的别名! alias 表示同一个指针,不同的名字。

        【讨论】:

          【解决方案6】:

          如果在函数中操作指针参数,函数返回后指针值不会被保存。但是如果你通过引用传递指针,新地址指针所引用的将在返回后保持:

          void foo1(int* x)
          {
              x = new int(2);
          }
          
          void foo2(int* &x)
          {
              x = new int(3);
          }
          int main()
          {
              int* x = new int(1);
              foo1(x);
              printf("x = %d\n", *x); // x = 1 => x is not referring to a new address after returning from foo1()
              foo2(x);
              printf("x = %d\n", *x); // x = 3 => x is referring to a new address after returning from foo2()
              return 0;
          }
          

          如果不删除之前分配的内存,当然这里会有内存泄漏。

          【讨论】:

            【解决方案7】:

            它几乎等同于以下内容,但更短一些,并且可能更容易在视觉上解析:

            insertnode(node** t, string value)
            {
              *t = new node;
              (*t)->val = value;
            }
            

            【讨论】:

            • 但肯定有区别,是不是占用了额外的内存?
            • 作为参数传递的引用在技术上是指针,不需要额外的内存,它是同样好的旧指针。
            猜你喜欢
            • 2011-06-17
            • 2010-10-11
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            • 2011-10-07
            • 1970-01-01
            • 2015-02-13
            • 2021-09-08
            相关资源
            最近更新 更多