正如标题本身所提到的 - 为什么指向引用的指针是非法的,而相反的在 C++ 中是合法的?
5 回答
指针需要指向一个对象。引用不是对象。
如果你有一个引用r
,一旦它被初始化,任何时候你使用r
你实际上都是在使用引用所指的对象。
因此,您不能首先获取引用的地址来获取指向它的指针。考虑以下代码:
int x;
int& rx = x;
int* px = ℞
在最后一行中,&rx
获取 引用的对象的地址rx
,因此与您所说的完全相同&x
。
引用实现的高级概念只是现有对象的另一个名称。您可以拥有指向对象(或函数)的指针,但不能拥有指向对象名称的指针。由于这个原因,指向引用的指针的想法是没有意义的。换句话说,引用是无关紧要的,在一般情况下它们根本不存在于内存中。它们不作为可以指向的东西而存在。
确实,在实践中的许多情况下,引用确实会占用内存(并且被伪装成指针)。但这只是特定于某些特定上下文的实现细节。一般情况下引用不占用内存,正如语言规范中明确说明的那样紧接着语言规范。
指向引用(指向对象)的指针和指向实际对象的指针之间有什么区别?不能将引用更改为引用另一个对象。只需使用指向相关对象的常规指针即可。
另一方面,对指针的引用与任何其他引用一样,为您提供了对特定变量的可修改句柄。在这种情况下,它恰好是一个指针。
因为引用不是可以指向的东西,这反过来又是因为它实际上不必在内存中的任何地方表示。存在引用来为已经存在的事物提供替代名称。您可以获得指向重命名事物的指针,但这是指向值的指针,而不是指向引用的指针。
假设“int *&X”是合法的,因为引用只是对象的另一个名称,表达式等于“int *X”并且没有用处。