int a[5] = {1,2,3,4,5};
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)((int)a);
int *ptr3 = (int *)((int )a +1);
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)((int)a);
int *ptr3 = (int *)((int )a +1);
printf("ptr:%d, ptr2:%x, ptr3:%x\n", ptr1[-1], *ptr2, *ptr,);
答案:5, 1, 2 00 00 00
看似很简单的语句,却很复杂,
首先要搞清楚&a和a的区别,a是数组首元素的首地址,而&a是整个数组的首地址,a+1是偏移int个字节,而&a+1是偏移整个数组的大小也就是20字节。那么推出ptr1[-1]=5了。
a是数组的首地址,那么就指向01 00 00 00的地址,由于是小端格式,高字节存高位,那打印是先去高字节的,所以ptr2就打印出00 00 00 01,也就是1
a强制转换成int,那么它不在是指针了,而是一个整形的数,数+1再强制转换成int*,相当于移动了1字节。指向01 00 00 00 02中的01后面那个00,因为是小端模式,所以打印是高字节对应高位,因为在内存中,int a[5]是这么存储的,01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00。所以02相对01来说是高字节,所以打印是02 00 00 00。