4

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

}
4

2 回答 2

12

&a是数组的地址,它的类型为“pointer-to- int[5]”。因此&a + 1,前进了一个完整的五个数组,并且点刚好经过该数组。

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

*) 这种类型的双关语是可以接受的,并且只要数组的基础类型是standard-layout就可以满足您的期望int

于 2012-07-30T15:11:51.647 回答
1

你还能期待什么? &a有类型,int (*)[5]所以&a + 1指向下一个;它是用于迭代元素的经典“结束”迭代器。然后,您将其转到 , 并访问它。形式上,我认为您的代码具有未定义的行为,因为您可以合法地对 a 的结果做的唯一事情是将其转换回原始类型。(在涉及到字符类型的指针的情况下也有例外。)实际上,在整个标准中散布的各种要求意味着您将获得最后一个in的地址。int[5]aint[5]reinterpret_castint*reinterpret_castinta

于 2012-07-30T15:16:19.617 回答