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

时间:2012-07-30 15:07:50

标签: 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;

}

2 个答案:

答案 0 :(得分:12)

&a是数组的地址,它的类型为“pointer-to-int[5]”。因此,&a + 1前进一整个五进制数组并指向数组之后。

pa是一个类型惩罚指针*,它现在将同一地址视为整数(不是数组!)数组中的地址。因此它与一个过去的指针a + 5相同。递减1会给出一个指向数组中最后一个元素的指针,即5

*)只要数组的基础类型是 standard-layout int是},这种类型的双关语是可以接受的,并且可以达到预期效果。 /子>

答案 1 :(得分:1)

您还期待什么? &a的类型为int (*)[5],因此&a + 1分 到int[5]之后的下一个a;它是经典的“结束”迭代器 迭代int[5]个元素。然后你reinterpret_cast到它 int*,然后访问它。在形式上,我认为您的代码未定义 行为,因为你可以合法地对待结果 reinterpret_cast的一部分是将其强制转换为原始类型。 (有一些例外情况涉及到指向字符类型的指针。) 在实践中,各种要求遍及整个标准 表示您将获得int中最后a的地址。