将指针传递给函数和将指针的引用传递给函数有什么区别?
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)
据我所知,我们将 t
作为指向结构的指针传递给 tsplit()
,而不是将指针的两个引用传递给相同类型的结构。为什么我们不能只传递指针而不是它们的引用?有什么意义吗?
是的,这是有道理的,如果您在 void tsplit(tnode t, tnode &l, tnode &r, int x)
中分配新内存
喜欢 t = 新结构节点;
只有当你将它声明为对指针的引用时,它才会被反射回来。
这些引用允许 tsplit()
操纵指针本身,而不仅仅是被指向的内容(每个 tnode
)。该函数可能分配内存等。
这是一个 typical/classical "return by reference"(也称为 out 参数 )问题,这里的 return 值是指针.
是的,这是有道理的。通常您可以将引用视为指针(有一些限制)。因此,您可以在示例中更改对指针的引用。当然语法也会发生变化,但我们不需要为此操心。您的示例如下所示:
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
和[=12=来做到这一点].换句话说,你不能改变t
的引用目标,但你可以用r
和l
来做,因为你有一个引用的引用(或指向指针的指针) .
为什么在指针上使用引用?因为指针也可以用于不同的事情,比如改变对象的所有权。语法看起来一样,但语义却大不相同。人们喜欢看事情的样子,马上就知道背后的意图和意义是什么。 IE。从语法中扣除语义。引用只能用于传递变量,因此您仅从事物的外观就知道会发生什么。
所以,我有一个结构
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)
中分配新内存喜欢 t = 新结构节点;
只有当你将它声明为对指针的引用时,它才会被反射回来。
这些引用允许 tsplit()
操纵指针本身,而不仅仅是被指向的内容(每个 tnode
)。该函数可能分配内存等。
这是一个 typical/classical "return by reference"(也称为 out 参数 )问题,这里的 return 值是指针.
是的,这是有道理的。通常您可以将引用视为指针(有一些限制)。因此,您可以在示例中更改对指针的引用。当然语法也会发生变化,但我们不需要为此操心。您的示例如下所示:
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
和[=12=来做到这一点].换句话说,你不能改变t
的引用目标,但你可以用r
和l
来做,因为你有一个引用的引用(或指向指针的指针) .
为什么在指针上使用引用?因为指针也可以用于不同的事情,比如改变对象的所有权。语法看起来一样,但语义却大不相同。人们喜欢看事情的样子,马上就知道背后的意图和意义是什么。 IE。从语法中扣除语义。引用只能用于传递变量,因此您仅从事物的外观就知道会发生什么。