解引用指针并存储对指向数据的引用,然后获取引用地址并对其执行指针运算。 C++
Posted
技术标签:
【中文标题】解引用指针并存储对指向数据的引用,然后获取引用地址并对其执行指针运算。 C++【英文标题】:Dereferencing pointer and storing reference to the pointed data, then getting address of reference and performing pointer arithmetic on it. c++ 【发布时间】:2020-07-24 22:31:29 【问题描述】:为了制作一个超出此问题范围的图表(我自己的,以了解指针/指向指针/数组的指针),我想知道是否足以假设以下内容:
int *intptr = new int[10]0;
int &intref = *intptr;
int thirdInt = *((&intref)+2);//is this defined behavior and always equivalent to intptr[2]?????
delete [] intptr;
正如代码中唯一的注释所问的那样:此代码是调用未定义的行为还是没有按照注释的预期工作?
【问题讨论】:
获取引用的地址会产生原始对象的地址;引用只是对象的另一个名称,毕竟是一个别名。所以是的,您可以像使用任何其他指向该对象的指针一样使用它。 (人们是否期望这是另一个问题,例如引用是否是函数参数。) 【参考方案1】:然后获取参考地址
澄清这一点:不可能“获取引用地址”。当您在引用上应用 addressof 运算符时,您将获得被引用对象的地址。
此代码调用未定义的行为
没有。
总是等价于 intptr[2]?????
是的(除了对于运算符 & 有奇怪重载的类类型,但这些类型几乎不应该使用)。
【讨论】:
在什么情况下需要编译器允许代码使用引用来访问被引用对象以外的东西?给定例如void doSomething(int &arg); int test() struct int x,y; foo; foo.y = 2; doSomething(foo.x); return foo.y;
是否需要一个除了原型之外对doSomething()
一无所知的编译器,以允许doSomething(foo.x)
可能改变foo.y
?
@supercat 对于如图所示的标准布局类,编译器确实需要允许这种可能性。对于非标准布局类,它可能在技术上不需要,但可能还有其他原因证明基于这些细节的优化是可以的,一般来说可能太难而无法实际使用。对于问题中的数组元素,编译器绝对不能假设对一个元素的引用不用于访问兄弟。
具有指示“此引用将仅用于访问指示的对象,而不是派生对封闭对象的引用”的方法将有助于 spme 有用的优化,我想不出任何希望能够访问封闭对象的代码将接受引用而不是指针的情况。将 pointer 传递给数组元素以访问整个数组在 C 和 C++ 中是惯用的,但为此目的传递 reference 是否同样惯用?
@supercat 惯用语,不。但也不是规则不允许的事情。我认为“此引用仅用于访问指定的对象”本身不足以进行优化。还必须保证函数不通过其他方式(例如全局状态或内部对象中的引用或指针)知道封闭对象的地址。在您的第一条评论中的极其简单的示例中,如果我们能够从参考中表达访问范围,那么这样的证明可能是可能的。但总的来说,证明很复杂。
编译器通常必须允许不透明函数可以修改任何全局对象的任何部分、函数从外部代码接收到指针的任何对象或任何静态或自动对象地址已暴露给外部代码。然而,一个试图识别所有可能应用这些条件的所有对象的编译器可以很容易地识别出许多对象都不可能适用。以上是关于解引用指针并存储对指向数据的引用,然后获取引用地址并对其执行指针运算。 C++的主要内容,如果未能解决你的问题,请参考以下文章