#include<stdio.h>
void main()
{
int a[]={1,2,3,4,5};
int *ptr1 = (int*)(&a+1);
int (*ptr2)[5] = (&a+1);
printf("%d %d\n",*(a+1),*(ptr1-1));
printf("%d %d",a,*(ptr2-1));
}
数组名本身就是指针,加个&,就变成了双指针,这里的双指针可看作是二维数组,加1,就是数组的整体加一行,所以ptr1指向第六个元素。
(此处ptr1需要是指向整型的指针类型才能表示指向的是数组a五个元素的下一个元素,因为&a是数组首元素的地址的地址,所以在(&a+1)前面需要进行类型转换将 int*[5]类型转换为int *,通过类型转换将原来指向数组的指针改为指向整型元素的指针,所以才会说指向第六个元素(并不存在))
int (*ptr2)[5] = (&a+1);
是&a+1不进行类型转换的情况,此时ptr2-1 指向的不是数组a的第五个元素,而是数组a的首元素的地址,即a;所以第二条输出语句输出的两个结果相同。