面试题

2018-08-29  本文已影响0人  guanjianhe
#include <stdio.h>

int main()
{
    int a[5]={1,2,3,4,5};
    int *p = (int *)(&a+1);
   // printf("%p\t%p\n",a,p);
    printf("%d\t%d",*(a+1),*(p-1));

    return 0;
}
/*
输出:
//0x7ffd9226ad50  0x7ffd9226ad64
2   5
*/

这题初看可能会直接得出答案是2 1,但真正答案是2 5,原因是(&a+1)这一句,a是一个数组名,也代表该数组的首地址,&a表示地址的地址,也就是二维指针了。这个二维指针是指向包含 5个成员的int型数组,相当于一个数组指针int (*p)[5],所以(&a+1)就指向了下个包含5个成员的int型数组首地址,之后又在外面做了类型转换(int *)转为一维指针,所以p-1就指向了上个数组的末地址,也就是a+4,最终答案*(p-1)就是5

上一篇下一篇

猜你喜欢

热点阅读