判断打印结果:
#include <stdio.h> int main(int argc, char* argv[]) { int a[4] = { 1, 2, 3, 4 }; int* ptr1 = (int*)(&a + 1); int* ptr2 = (int*)((int)a + 1); printf("%x\n%x\n", ptr1[-1], *ptr2); return 0; }
分析:
1.ptr1[-1]
- &a + 1为偏移整个数组的长度,即为4*4个字节。
- ptr[-1] = *(ptr – 1)
2.*ptr2
- (int)a强制类型转换为整形(非指针)
- (int*)((int)a + 1)相当于从左数第二个字节的起始地址开始向后读一个int的长度。即,0002。
- %x转换为16进制输出为0x2000000。
结果:
以上三题出自https://blog.csdn.net/Zhang_1218/article/details/76598525