#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;
}
从内存的角度分析:(借用一下别人的图片)
首先:
解释一下第二条语句:
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