int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1);//&a+1 跳过整个数组后的地址 数组类型转换后存入*ptr
printf("%d\n", *(ptr - 1));//ptr-1 解引用获得的是a[5] 的值
p = (struct test*)0x100000;
printf("struct大小=%d\n", sizeof(*p));//结构体大小是 24
printf("%p\n", p + 0x1);//p+1 跳过整个结构体大小 0x100018(十六进制)
printf("%p\n", (unsigned long)p + 0x1);//将0x100000 强制转换位long整型 +1 就是实际值+1
printf("%p\n", (unsigned int*)p + 0x1);//将p结构体类型强制转换成int*类型,+1 就是跳过四个字节
int* ptr1 = (int*)(&a + 1);//&a+1 跳过整个数组后得到的地址转换成int* 指针存放在 ptr1里
int* ptr2 = (int*)((int)a + 1);//a位首元素地址,转换成int类型一个十六进制的值 再+1
//转换成int* 指针存放入ptr2 此时+1 表示向后移动一个字节
printf("%x,%x\n", ptr1[-1], *ptr2);//ptr1[-1]=*(ptr1 - 1) 此时解引用访问的是a[4] 值为5