参数中都有指针和引用

pointer and reference both in arguments

本文关键字:引用 指针 参数      更新时间:2023-10-16

我在两个树代码中看到,树类的函数同时具有*和&带有节点例如,在BST中插入一个节点,函数类似于

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

我想知道为什么我们在一般情况下引用指针,尤其是在这种情况下。还请提及,如果有任何其他情况,谢谢

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

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

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

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

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

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 = %dn", *x); // x = 1 => x is not referring to a new address after returning from foo1()
    foo2(x);
    printf("x = %dn", *x); // x = 3 => x is referring to a new address after returning from foo2()
    return 0;
}

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

它相当于以下内容,但略短,可能更容易进行可视化解析:

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

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

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

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

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

当您声明这样的函数时:

foo(node* param);

param实际上是一个通过值传递的指针。。所以你有一个指针的副本。。

而如果你传递一个参数:

foo(node*& param);

您所拥有的是一个通过引用传递的指针,因此您拥有该指针的别名!alias表示相同的指针有不同的名称。