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
)。该函数可能分配内存等。这是一个典型的“引用返回”问题,返回值是指针。