关于C语言的一个有关问题,求高手解答

关于C语言的一个问题,求高手解答
在x86系统下 考虑输出值

#include <stdio.h>

void main()
{
int a[5]={1,2,3,4,5};
int *p1=(int *)(&a+1);
int *p2=(int *)((int)a+1);
printf("%x,%x\n",*p1[-1],*p2);
}


------解决方案--------------------
最后一句好像应该是printf("%x,%x\n",p1[-1],*p2);

&a的类型是int (*)[5],&a+1表示&a+5*sizeof(int),p1指向了a[4]后面的一个位置,可以认为是a[5],p1[-1]=a[4]。


p2:(int)a,把指针的值转化为int ,然后加1,再强制转化为int *,这里的加1就是普通的数值加1,不是移动一个int的位置,就是说p2指向的是a[0]的3个字节和a[1]的一个字节组成的int,x86应该是02000000.
------解决方案--------------------
在x86系统下 考虑输出值

#include <stdio.h>

void main()
{
int a[5]={1,2,3,4,5};
int *p1=(int *)(&a+1);
int *p2=(int *)((int)a+1);
printf("%x,%x\n",*p1[-1],*p2);
}
那*p1[-1] 是不是p1[-1]啊?若果是的话。
 先说*p1,对a用&表示数组升维,所以&a整体是个行指针,&a+1表示从数组a行首移动到行尾,即元素a[4] = 5后一个元素,然后用(int*)将&a+1强制类型转换为列指针,赋值给p1,由于p1是列指针,所以p1[-1]表示向前移动一个元素指向a[4].所以p1[-1] = 5.
再说p2,由于x86是小端机器,即低地址存低位,又由于Int在32位机上占四个字节,(int) a将a强制转换为int型,加1后指针移动一个字节。所以最后*p2 = 2000H