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

Why the output of *(pa-1) is the last element of `a`?

本文关键字:元素 最后一个 输出 pa-1 为什么      更新时间:2023-10-16

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

数组的地址,它的类型为"指针到- int[5]"。因此,&a + 1前进了整个五人阵列,并指向刚刚经过阵列。

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

*( 这种类型双关语是可以接受的,只要数组的基础类型是标准布局int就是这样,就可以完成您的期望。

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