将指针传递给函数和将指针传递给函数有什么区别?

时间:2015-06-25 10:25:00

标签: c++ pointers reference treap

所以,我有一个结构

struct node
{
    node * l;
    node * r;
};

然后,有

typedef node* tnode;

了解此功能:

void tsplit(tnode t, tnode &l, tnode &r, int x)

当我得到它时,我们将t传递给tsplit()作为指向结构的指针,而不是将两个指针引用传递给相同类型的结构。为什么我们不能只传递指针而不是引用?它有意义吗?

3 个答案:

答案 0 :(得分:0)

引用允许tsplit()操纵指针本身,而不仅仅是指向的内容(每个tnode)。该函数可能会分配内存等。

这是一个典型/经典的“按引用返回”(也称为 out参数)问题,这里的返回值是指针。

答案 1 :(得分:0)

是的,这是有道理的。通常,您可以将引用视为指针(具有一些限制)。因此,您可以更改示例中对指针的引用。当然语法也会改变,但我们不需要为此烦恼。您的示例如下所示:

void tsplit(tnode t, tnode *l, tnode *r, int x)

不同之处在于,您可以修改lr但不是t下的内容,typedef会对其进行抽象,但您可以将其展开:

void tsplit(node* t, node** l, node** r, int x)

现在,意思是您可以更改t下的内容,但无法更改t本身,您可以使用lr执行此操作。换句话说,您无法更改t的参考目标,但您可以使用rl来执行此操作,因为您有对引用(或指针指针)的引用

为什么使用引用而不是指针?因为指针也可以用于不同的事情,比如更改对象的所有权。语法看起来一样,但语义却截然不同。人们喜欢看事物的外观,并立即知道其背后的意图和意义。即从语法中扣除语义。引用只能用于传递变量,因此您可以从事物的外观中了解所期望的内容。

答案 2 :(得分:-1)

是的,这是有道理的,如果你在void tsplit(tnode t,tnode& l,tnode& r,int x)中分配新内存

喜欢t = new struct node;

然后只有当你将它声明为指针的引用时才会反射回来。