#include<stdio.h>
int main()
{
  int a[5]={1,2,3,4,5};
  int* ptr=(int*)(&a+1);
  printf("%d,%d",*(a+1),*(ptr-1));
  return 0;
}

从内存的角度分析:(借用一下别人的图片)

关于指针的经典笔试小题_#include

首先:

解释一下第二条语句:

int* ptr=(int *)(&a+1)

&a表示一个数组指针,其类型为int(*)[5],所以&a+1表示int(*)[5]+1;执行&a+1之后,ptr指针的偏移量其实是sizeof(int)51+a;&a+2相当于整个数组的指针加2:a+sizeof(int)5*2;(由于a数组内有五个元素)

之所以要进行整形转换是因为:ptr和&a+1的类型不匹配,一个是int*;一个是int(*)[5]

又由于ptr是int*类型所以ptr-1意思就是减去四个字节(int类型)也就是a[5]前面的元素的地址,然后再解引用操作就是a[4],也就是5。

其次:

*(a+1)

a表示首元素地址,首元素地址加一表示第二个元素的地址,再解引用操作表示第二个元素的值,也就是2

所以最后的结果就是:2,5