【发布时间】:2014-12-14 06:01:04
【问题描述】:
我在竞赛试卷中发现了这个程序:
#include <iostream>
void main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
printf("%d %d ",*(a + 1), *(ptr - 1));
}
输出为2 5
现在当我将第 5 行更改为 int *ptr=(int*)(&a); 和 printf("%d %d ",*(a + 1), *(ptr)); 时
输出变成2 1
在第一种情况下,ptr 获得了array+1 的最后一个地址,而在第二种情况下,ptr 获得了相同的数组地址(a 的地址)。
我的疑问是,为什么当 a 递增并分配给 ptr 和 a 分配给 ptr 而不递增时,此分配会显示不同类型的行为?
【问题讨论】:
-
void main()不是有效的 C++。 -
(&a + 1) 与 (&a[0] + 1 ) 或 (a + 1) 不同。不确定这是否是您在分配给 int *ptr 时的意图。
-
@MohitJain,
*(a+1)==a[1]。所以不是UB。 -
@CoolGuy 抱歉
*(((int *)(&a + 1)) - 1)是 UB。 Read this post 了解详情。 -
@MohitJain 如果我知道你之前提到的问题,我会在这里提出一个新问题,我不知道如何谷歌我的疑问,以便弹出你提到的问题!
标签: c++ c arrays pointers address-operator