为什么 *(pa-1) 的输出是 'a' 的最后一个元素
Why the output of *(pa-1) is the last element of `a`?
我从以下代码的输出中得到的是*(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
的地址。
相关文章:
- lower_bound()返回最后一个元素
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 在 QListView 中显示最后一个元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- C++链表最后一个元素的迭代器?
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?