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而不递增时显示不同类型的行为?
获取数组的地址时,会得到一个指向5个int的数组的指针(即int(*)[5]).当您递增该指针时,它会移动5个整数的数组大小.所以它指向一系列数组中的下一个数组(如果你实际上有一系列数组).然后,当您将该指针转换为时int*,它将成为指向int第二个(不存在的)数组中的第一个的指针,该数组是第一个数组的最后一个元素之后的一个元素.这就是你的第一个例子所发生的事情.
在第二个示例中,您没有递增指向数组的指针,因此当您将其转换为时int*,它将成为指向int数组中第一个指针的指针.