C++指针(按引用传递)问题

9

一个通过引用传递的指针。为什么呢?指针不就是引用吗?这个参数到底发生了什么?

void someFunc(MyPtr*& Object)
{

}

1
“指针不就是引用吗?”这里有一点歧义。在计算机科学的一般术语中,指针是一种引用。然而,C++使用同样的词“引用”来表示一种特定的语言特性。C++引用也是一种引用,但它们是一种不同类型的引用,而指针不是C++引用。 - Steve Jessop
@ Steve Jessop: +1 我也因为类似的原因写了我的答案。Ref Vs Pointer 不错的视觉文档 -> http://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf 看起来似乎总是会引起很大的困惑。C# 中也有类似的问题,但很多人并没有意识到存在问题 - 实际上,它比 C++ 更复杂,因为它在 C++ 概念的基础上还有逻辑层。太糟糕了,很少有人意识到当涉及“指针”时,C# 实际上比 C++ 更复杂(这里不谈论不安全代码)。 - user44298
但是从另一方面来看,如果你这样考虑的话,它就非常简单了:当计算机存储数据(例如一个变量)时,数据只有两个特征:(1)内存中的地址和(2)写在该地址上的值。这是任何数据。指针、引用等抽象概念是为了方便而引入的。任何存储数据的介质都像纸质书籍一样,比如 DVD :你有一页纸上写了一个句子 - 实际上它们是相同的 - 你必须要在(1)某个地方写下这个信息(2)存储它。另一方面,关于储存方式,梦想可能会更加复杂 :) - user44298
7个回答

8

简单来说,它使您能够更改指针本身:可以将其更改为指向函数中的另一个位置。并且更改将在外部反映出来。


5

它使您能够:

void someFunc(MyPtr*& Object)
{
  //Modify what Object is pointing to
  Object=&old_Object;

  //You can also allocate memory, depending on your requirements
  Object=new MyPtr;

  //Modify the variable Object points to
  *Object=another_object;
}

以上情况下难道不会出现内存泄漏吗? - Mahesh
1
@Mahesh 不需要,只要调用者知道在使用完后必须删除新对象即可。 - trojanfoe

1

其他人将不得不投票验证这一点,因为我对C++有点生疏,但我相信这里的想法是你会通过引用传递指针,也就是说,你不是创建一个新的空间来存储指针本身,而是使用指针的引用,因此如果你修改了指针而不仅仅是值,那么在从函数返回后它将被修改,否则你只能修改传入位置的值。希望这样说得清楚。


1
与仅传递指针的区别在于,如果更改指针(Object = x),则调用函数将看到此更改。当您传递 MyPtr** Object 并取消引用指针 *Object = x; 时,您可以实现相同的效果。使用第二种方法,您可以将 NULL 传递给函数。对于引用,这是不可能的。

1
你的理解还不太对。指针content是通过引用传递的,但指针本身仍然是按值传递的,即将其重新分配给其他指针不会在退出方法时反映出来,因为指针将被设置为指向与调用之前相同的内存块。可以将其视为简单的int变量。但是,使用&*或**可以重新分配指针,并且这将在此方法范围之外可见。

1
为什么?
出于与传递其他任何东西的引用相同的原因。
指针不就是引用吗?
天哪,绝对不是。两者根本不同。你可以尝试从指针开始建立一个引用的心理模型,但是一旦你修复了所有的差异,你就会得到一个可怕的不合逻辑的混乱。
引用是一个更简单、更直观的概念,只有“历史原因”才会在它们之前尝试理解指针。现代C++很少使用裸指针,并尽可能将它们视为实现细节。
引用是已经存在的事物的另一个名称。就是这样。当作为函数参数使用时,它们允许被调用的函数引用调用方的数据。

0

这也意味着指针可以是0(NULL),这对于方法可能具有含义。引用必须始终有效,不能变成“无”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接