【问题标题】:What is the difference between passing a pointer to function and passing reference of pointer to function?将指针传递给函数和将指针的引用传递给函数有什么区别?
【发布时间】:2015-06-25 10:24:59
【问题描述】:

所以,我有一个结构

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

那么,有

typedef node* tnode;

不了解的是这个函数:

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

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

【问题讨论】:

  • 如果您“无法理解”某事,为什么还要浪费时间来解释?解释可以帮助那些理解但能够理解的人。
  • 将 tnode 的非 const 引用传递给 tsplit(...) 使函数有机会操纵 l 和 r(让它们指向另一个地址)
  • @KerrekSB 可能是因为 OP 在英语方面不是最好的,并且没有意识到细微但在逻辑上非常重要的区别。 =P
  • Here 概述了如何传递引用、原始指针和智能指针。
  • 引用允许tsplit 自己操作指针,而不仅仅是指向的内容(每个tnode)。该函数可能会分配内存等。这是一个典型的“引用返回”问题,返回值是指针。

标签: c++ pointers reference treap


【解决方案1】:

是的,这是有道理的。通常,您可以将引用视为指针(有一些限制)。因此,您可以在示例中更改对指针的引用。当然语法也会改变,但我们不需要为此烦恼。您的示例如下所示:

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来做到这一点,因为你有一个引用的引用(或指向指针的指针)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      like t = 新结构节点;

      只有当你声明它为指针的引用时,它才会被反射回来。

      【讨论】:

        猜你喜欢
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        相关资源
        最近更新 更多