我从以下代码的输出中得到的是*(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;
}
答案 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
的地址。