C++ 将指针传递给函数和将指针引用传递给函数有什么区别?

C++ 将指针传递给函数和将指针引用传递给函数有什么区别?,c++,pointers,reference,treap,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(),然后将两个指针引用传递给相同类型的结构。为什么我们不能只传递指针而不是它们的引用?这有意义吗?是的,如果在void tsplit(tn

所以,我有一个结构

struct node
{
    node * l;
    node * r;
};
然后是

typedef node* tnode;
我不理解的是这个函数:

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

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

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

like t=新结构节点


然后,仅当您将其声明为指针引用时,它才会被反射回来。

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


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

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

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

因此,不同之处在于,您可以修改
l
r
下的内容,但不能修改
t
,typedef对其进行了抽象,但您可以对其进行扩展:

void tsplit(节点*t、节点**l、节点**r、整数x)

现在,意思是您可以更改
t
下的内容,但您不能更改
t
本身,您可以使用
l
r
来执行此操作。换句话说,您不能更改
t
的引用目标,但可以使用
r
l
来更改,因为您有一个引用(或指向指针的指针)


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

如果您“无法理解”某些内容,为什么要浪费时间来获取解释?解释可以帮助那些不懂某些东西但能够理解的人。将tnode的非常量引用传递给tsplit(…)可以让函数有机会操纵l和r(让它们指向另一个地址)@KerrekSB可能是因为OP不是英语中最好的,并且不知道其中的微妙之处,但从逻辑上讲,这是一个非常重要的区别=P是关于如何传递引用、原始指针和智能指针的概述和建议。引用允许
tsplit
操作指针本身,而不仅仅是指向的内容(每个
tnode
)。该函数可能分配内存等。这是一个典型的“引用返回”问题,返回值是指针。