2012-03-05 53 views
1

我在几个树代码的树类的函数有:*和&与例如节点 在一个BST函数是这个样子指针和引用都在争论

insertnode(node * &t,string value) 
{ 
t = new node; t-> val = value 
// code to find right place in BST 
} 
插入一个节点看到

我想知道为什么我们通常会引用指针,特别是这种情况。请同时提及是否有其他情况,谢谢

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

回答

6

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

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 

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

+0

好吧,我明白我的情况,谢谢,还有一件事情在foo中有内存泄漏? – 2012-03-05 09:25:35

+0

这取决于其余的代码。 – 2012-03-05 09:26:49

+1

@sparkling_spark你失去了指向新分配内存的指针。函数返回后无法释放'x'。 – 2012-03-05 09:32:39

0

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

+0

即递归试图找到合适的地方插入节点,怎么样了这项工作 – 2012-03-05 09:18:36

0

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

0

foo(node* param); 

PARAM实际上是value..so你有指针的拷贝传递一个指针。 。

而如果你传递一个参数:

foo(node*& param); 

你有什么是通过引用传递的指针,所以你有一个别名的指针!别名表示具有不同名称的相同指针。

3

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

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; 
} 

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

+0

谢谢,关注SO社区,跟上好工作 – 2012-03-05 09:36:04

1

它等效于下面的好看多了,但有些短,也许更容易直观解析:

insertnode(node** t, string value) 
{ 
    *t = new node; 
    (*t)->val = value; 
} 
在这种情况下
+0

谢谢,关注SO社区,跟上好工作 – 2012-03-05 09:35:45

+0

但是肯定有一些区别,它没有使用额外的内存? – 2012-03-05 09:38:34

+0

作为参数传递的引用在技术上是指针,不需要额外的内存,它是旧的指针。 – 2012-03-05 09:49:01