题目:
int main()
{
int a[4] = { 1,2,3,4 };
int* ptrl = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x",ptr1[-1], *ptr2);
return 0;
}
思路分析:
int* ptrl = (int*)(&a + 1);
ptr1[-1]
- &a表示的是整个数组a的地址,而&a+1表示的是加上一个数组的字节总数后的地址。
- 经过了int*后强制转化为了int*类型的指针,并且赋值交给了ptr1
- 而后ptr[-1]可以转化为*(ptr1+(-1))也就是*(ptr1-1),而ptr1内存储的是被强制变为(int*)的(&a+1)的地址位置,所以-1变为了减去一个int类型的字节数,也就是一个元素,最后算出的答案是4
可参考http://t.csdn.cn/NeYUY
int* ptr2 = (int*)((int)a + 1);
- 和大小端有关!
- 原先的a是int*类型,被强制转化为了int类型
- 且a是地址,被转化后,地址变成了一个int的类型的地址
- 原先的地址加1是加四个字节(因为是int*类型的,所以加1等于加4个字节,表示下一个元素)
- 而在强制转化后的+1就是地址物理数据上面的+1,就相当于是加了一个字节的地址,而在内存块中展示的数据是16进制,也就是说从上图中的01位置到了01后面的00位置
- +1后,同时也是一个地址
- 在使用int*强制转化,所以又变成了一个指针, 而后在*就表示往后在拿三个字节
- 同时打印出来就与大小端有关了
因为Vs编译器是小端,所以如上图所示,最后打印出来则是02 00 00 00