指针题
例1:
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
结果:2 5
解释:*(a + 1)相当于a[1];
*(ptr - 1))就是数组指针指向下一个数组,再退回一步。
例2:
int main()
{
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%d,%x", ptr1[-1], *ptr2);
return 0;
}
结果:4 2000000
解释:&a是数组指针,指向一个数组,相当于int(*)[4]这样的类型。
&a+1,就是指向下一个4个元素的数组,并且地址与这个a[4]挨着。
(int *)(&a + 1)把它由数组指针强转成int指针,此时指向4后边的位置。
ptr[-1]相当于*(ptr - 1),指针又退回一步,指向上一个数组的最后一个元素4。
(int)a就是把指向a数组的第一个字节的地址转成int
(int)a + 1就是向后移动一个字节,也就是a[0]的四个字节的第二个字节.
然后转成int*,再解引用后就往后读四个字节。
然后%x按照16进制打印。
例3:
struct Test
{