-1

所以,我有一个结构

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

然后,有

typedef node* tnode;

明白的是这个功能:

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

据我了解,我们将ttotsplit()作为指向结构的指针传递,而不是将指针的两个引用传递给相同类型的结构。为什么我们不能只传递指针而不是它们的引用?这有什么意义吗?

4

3 回答 3

0

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

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

于 2015-06-25T10:45:55.287 回答
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本身,你可以用land来做到这一点r。换句话说,您无法更改 的引用目标t,但可以使用rand来更改l,因为您有对引用的引用(或指向指针的指针)。

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

于 2015-06-25T10:53:21.437 回答
-1

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

像 t = 新结构节点;

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

于 2015-06-25T10:30:57.597 回答