69,371
社区成员
发帖
与我相关
我的任务
分享
int a[5] = {1,2,3,4,5};
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)((int)a + 1);
printf("%x,%x\n",ptr1[-1],*ptr2);
int a[5] = {1,2,3,4,5};
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)((int)a + 1);
printf("%x,%x\n",ptr1[-1],*ptr2);
int a[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &a; /* 数组指针,指向数组a,指针p的步长是 sizeof(int [5]) */
++p; (&a + 1) /* p + 1 即指针p偏移了sizeof(int [5]) p指向数组a[4]后面的一个数组 */
int *ptr1 = (int *)p;/* 强制转换p 成 int* 型指针赋给ptr1, int *型指针步长是sizeof(int) */
printf("%x\n", ptr1[-1]);
/* ptr1[-1]编译器会解释为 *(ptr1 - 1),ptr1的步长是sizeof(int), 所以其值是5*/
int *ptr2 = (int *)((int)a + 1);
/*
* a本身的步长是sizeof(int), 但强制转换成int, 后 + 1, 即普通的加法,不涉及指针偏移
* 假设是在x86小端字节序主机上:
* a-------------> 01 //地址低端
* (int)a + 1----> 00 //即现在 ptr2指向的地址
* 00
* 00 ===> a[0](int型是4bytes)
* a+1-----------> 02
* 00
* 00
* 00 ===> a[1]
* a+2-----------> 03
* 00
* ……
* 从上面可以看到 ptr2 指向的地址, 所以 *ptr2 的值是 0x20000000
* 上面的是在上小端字节序主机的结果,在大端字节序主机上的值是不一样的,值是 0x0100.理论都是一样的
*/