首先,a是具有5个整型变量的数组,&a就是取数组的首地址,其结果和a是相同的。
&a+1是指针的加法运算,其本质是使指针指向下一个数据。而a是一个数组的首地址,
从而使&a+1指向了下一个具有5个整型变量的数组,于是,就把数组中元素5的下一个地址赋值给
了ptr1。比如说,在我的机子上,a的地址是0x0012ff6c,五个整型变量使得a【4】的地址是0x0012ff7c.
于是,下一个地址就是0x0012ff80,这就是赋值给ptr1的值,ptr1[-1]是让ptr1指向前一个整型变量的地址,
也就是a[4]的地址0x0012ff7c,从而,打印出的就是a[4]的值5。
int *ptr2=(int*)((int)a+1);
这一行的意思是吧指针变量强制转换为整型数据,+1之后,再转回int型指针,其本质是指向了a地址的下一个
字节的地址,即0x0012ff6d,要打印*ptr2就要从0x0012ff6d开始取四个字节的值,组成一个整数输出。读出时,
牵扯到大端还是小端序的问题:
1、所谓大端(big-endian)序,就是读取或者存放数据时,最低 位 对应 高地址 。
2、所谓小端(big-endian)序,就是读取或者存放数据时,最低 位 对应 低地址 。
从你的结果看来,你的平台是小端序的,数据存储方式如下:
01
00 00 00 02 00 00 00 03 00 00 00 04……
(低地址)---------------------------------(高地址)
当你读取数字的时候,就是读取的我上面的用红色字体显示的数字,按照小端序的读法,读出的值变成正常顺序之后就是
02 00 00 00即2000000
解释完毕,如有疑问,我很可以再讨论