int main()
{
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%x,%x", ptr1[-1], *ptr2);
return 0;
{
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%x,%x", ptr1[-1], *ptr2);
return 0;
}
这是源代码,输出结果是4,20000000, 第一个ptr[-1]是ptr偏移-1位, &a是取数组a的地址,+1是加上1*sizeof(a),
指向数组a后面的地址,ptr[-1]就是4; 第二个在小端存储器上假设内存是从地址0开始存储的,
00000000 :01 00 00 00 02 00 00 00
00000008: 03 00 00 00 04 00 00 00
a的值是0000000000强制转化为int型后就是值00000000加1就是单纯的加1, 为00000001,转化为地址,指向的就是
00 00 00 02 00 00 00 00 %x输出4个字节02 00 00 00