繁体   English   中英

传递函数指针和传递函数指针引用有什么区别?

[英]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)

所以区别在于,您可以修改lr而不是t ,typedef 将其抽象化,但您可以扩展它:

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

现在,意思是你可以改变t下的内容,但你不能改变t本身,你可以用lr来做到这一点。 换句话说,你不能改变t的引用目标,但你可以用rl来做,因为你有一个对引用的引用(或指向一个指针的指针)。

为什么在指针上使用引用? 因为指针也可以用于不同的事情,比如改变对象的所有权。 语法看起来相同,但语义却大不相同。 人们喜欢看事物的样子,立即知道它背后的意图和含义。 即从语法中扣除语义。 引用只能用于传递变量,因此您仅从外观上就知道会发生什么。

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

比如 t = 新的结构节点;

那么只有当您将其声明为对指针的引用时,它才会被反射回来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM