为什么*(pa-1)的输出是`a`的最后一个元素?

JDe*_*ein 4 c++

我从下面代码的输出得到的是*(pa-1)=5:为什么呢?

#include<iostream>

using namespace std;

int main(){

    int a[5]={1,2,3,4,5};
    int *pa=(int *)(&a+1);

    cout<<"*(pa-1)="<<*(pa-1)<<endl;

}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 12

&a是数组的地址,它的类型为"指向 - int[5]".因此&a + 1,整个五个数组的进展和刚好超过数组的点.

pa是类型punned指针*,现在把相同的地址作为阵列内的地址的整数(未阵列!).因此它与一个过去的结束指针相同a + 5.递减一个给出一个指向数组中最后一个元素的指针,即5.

*)这种类型的双关语是可以接受的,只要数组的基础类型是标准布局,就可以int达到预期效果.

  • 数组是特殊的:`a`是它自己的地址,而`&a` ==`a` - 虽然有不同的类型.很好的写作. (3认同)