C++指针指向引用

9
在C++中,拥有一个指向引用的指针是否合法?
例如:
int &ref = array[idx];
func(&ref);

如果您无法更改已存在的库中的func()函数,那么我能想到的一个原因是您可能希望这样做。


看看这个,它可能会帮助你理解。http://www.codeproject.com/KB/cpp/PtrToPtr.aspx - user668693
4个回答

12
这不是一个有效的类型。可以获取引用的地址,但“指向T类型的引用的指针”不是有效的类型。在这里所做的是取对象本身的指针,因为“对象的引用只是创建了另一个名称,通过该名称可以访问同一对象”。

2
不,引用并不是对象本身。但是给引用命名会导致对所引用的对象执行操作,例如取地址操作。 - Ben Voigt
@Ben:引用可能以某种方式实现(例如指针),但在语言层面上,引用和对象始终以完全相同的方式行为。我认为我们在本质上达成了一致,但您认为措辞不当,如果是这样,我必须承认这不是我的创作:http://www.parashift.com/c++-faq-lite/references.html#faq-8.1 - Jon
2
常见问题解答通常都很好,但是那个特定的答案有一些不幸的过度简化。这个错误已经在其他堆栈溢出的问题中被反复讨论了,但最简单的证明引用不是对象的方法是考虑析构函数何时被调用。 - Ben Voigt
https://dev59.com/VHVD5IYBdhLWcg3wL4mM#596750 - Ben Voigt

9

这段代码是合法的,但它并没有创建一个指向引用的指针。它创建了一个指向被引用对象(即引用目标)的指针。


0

指针指向一个对象,而引用不是一个对象,不能有指向它的指针。引用只是一个 别名

这篇来自 SO 的文章提供了一些信息 - 为什么引用的指针是非法的?


-1

如果你所说的“拥有一个引用的指针”是指获取引用的地址(如你的示例:&ref),那么这是完全合法的。任何变量都是标识符,因此根据C++-03的§ 5.3.1-2,可以应用&。具有引用类型的表达式是lvalue,因此同一节中也适用&

如果你所说的“拥有一个引用的指针”是指一个指向引用的指针类型(例如int &*),那么根据§ 8.3.2-4(以及§ 8.3.1-4的注释),不行。


这并没有回答问题。 - Matthew Flaschen
@Ben:一个表达式可以有引用类型。将&应用于引用的值等于将&应用于所指物的值是另一回事,也就是行为而不是合法性的问题。 - outis
@outis,“&”是取地址运算符。指针是一种复合类型(见C++ §3.9.2/1)(指向X的指针)。问题是是否有指向引用的指针类型,答案明确为否定。 - Matthew Flaschen
@outis:完全正确。但是当引用应用于任何操作时,都需要找到引用的指向对象,因此实现方式相同。在引用上应用&,如&ref,会导致编译器执行以下操作:(1)找到指向对象,(2)获取在步骤1中找到的lvalue的地址。在任何时候,“引用的地址”这个概念都没有意义。 - Ben Voigt
我应该说,我理解你的观点,这是一种看待问题的方式,但它并不是唯一有效的方式。我并不试图争辩我的方式是唯一的方式,只是它是一种方式。甚至并不一定是我一直使用的方式。 - outis
显示剩余15条评论

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