为什么指针在c ++中的行为与此类似

Nid*_*vid 2 c c++ arrays pointers address-operator

我在比赛问题文件中找到了这个程序:

#include <iostream>
void main() 
{    
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int*)(&a + 1);
    printf("%d %d ",*(a + 1), *(ptr - 1));
}
Run Code Online (Sandbox Code Playgroud)

输出是 2 5

现在,当我将第5行更改为int *ptr=(int*)(&a);和printf("%d %d ",*(a + 1), *(ptr));

输出变成了 2 1

在第一种情况下ptr得到了最后一个地址,array+1在第二种情况下ptr得到了相同的数组地址(地址a).

我怀疑的是,为什么这个赋值在a递增并分配给时ptr以及何时a赋值ptr而不递增时显示不同类型的行为?

Ben*_*ley 5

获取数组的地址时,会得到一个指向5个int的数组的指针(即int(*)[5]).当您递增该指针时,它会移动5个整数的数组大小.所以它指向一系列数组中的下一个数组(如果你实际上有一系列数组).然后,当您将该指针转换为时int*,它将成为指向int第二个(不存在的)数组中的第一个的指针,该数组是第一个数组的最后一个元素之后的一个元素.这就是你的第一个例子所发生的事情.

在第二个示例中,您没有递增指向数组的指针,因此当您将其转换为时int*,它将成为指向int数组中第一个指针的指针.