[英]What is the difference between passing a pointer to function and passing reference of pointer to function?
所以,我有一个结构
struct node
{
node * l;
node * r;
};
然后,有
typedef node* tnode;
我不明白的是这个功能:
void tsplit(tnode t, tnode &l, tnode &r, int x)
据我tsplit()
,我们将t
作为指向结构的指针传递给tsplit()
,而不是传递指向同一类型结构的两个指针引用。 为什么我们不能只传递指针而不是它们的引用? 这有什么意义吗?
引用允许tsplit()
操作指针本身,而不仅仅是被指向的内容(每个tnode
)。 该函数可能会分配内存等。
这是一个典型/经典的“引用返回”(也称为out 参数)问题,这里的返回值是指针。
是的,这是有道理的。 通常,您可以将引用视为指针(有一些限制)。 因此,您可以在示例中更改对指针的引用。 当然语法也会改变,但我们不需要理会它。 您的示例如下所示:
void tsplit(tnode t, tnode *l, tnode *r, int x)
所以区别在于,您可以修改l
和r
而不是t
,typedef 将其抽象化,但您可以扩展它:
void tsplit(node* t, node** l, node** r, int x)
现在,意思是你可以改变t
下的内容,但你不能改变t
本身,你可以用l
和r
来做到这一点。 换句话说,你不能改变t
的引用目标,但你可以用r
和l
来做,因为你有一个对引用的引用(或指向一个指针的指针)。
为什么在指针上使用引用? 因为指针也可以用于不同的事情,比如改变对象的所有权。 语法看起来相同,但语义却大不相同。 人们喜欢看事物的样子,立即知道它背后的意图和含义。 即从语法中扣除语义。 引用只能用于传递变量,因此您仅从外观上就知道会发生什么。
是的,这是有道理的,如果您在 void tsplit(tnode t, tnode &l, tnode &r, int x) 中分配新内存
比如 t = 新的结构节点;
那么只有当您将其声明为对指针的引用时,它才会被反射回来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.