我从以下代码的输出中得到的是*(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;
}
我从以下代码的输出中得到的是*(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;
}
&a
是数组的地址,它的类型为“pointer-to- int[5]
”。因此&a + 1
,前进了一个完整的五个数组,并且点刚好经过该数组。
pa
是一个类型双关指针*,它现在将相同的地址视为整数数组(不是数组!)中的地址。因此,它与过去的指针相同a + 5
。减一给出指向数组中最后一个元素的指针,即5
.
*) 这种类型的双关语是可以接受的,并且只要数组的基础类型是standard-layout就可以满足您的期望int
。
你还能期待什么? &a
有类型,int (*)[5]
所以&a + 1
指向下一个;它是用于迭代元素的经典“结束”迭代器。然后,您将其转到
, 并访问它。形式上,我认为您的代码具有未定义的行为,因为您可以合法地对 a 的结果做的唯一事情是将其转换回原始类型。(在涉及到字符类型的指针的情况下也有例外。)实际上,在整个标准中散布的各种要求意味着您将获得最后一个in的地址。int[5]
a
int[5]
reinterpret_cast
int*
reinterpret_cast
int
a