#include<stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int* p =(int *)(&a+1);
printf("%d,%d\n", *(a+1), *(p-1));
return 0;
}
[解析]:
注:左边为下标,右边为值!
printf("%d,%d\n",*(a+1),*(p-1));
//这里的*(a+1) 就是a[1],也就是说下标为1的值对应2!
//而这里的*(p-1)那就有点绕啦
int *p =(int *)(&a+1);
//解析:p等于a取地址加一,然后再强制转换成int(也就是整型)
//而这里的a取地址的具体含义是什么呢?大家可以先不看下面UP的解析自己在脑海中想想
解析:一维数组名取地址;它相当于一个二维数组名 转换成代码就是 int(*p)[5]; p =&a;
而 p =&a;就是p+1,然后移动5个元素
例:如果p=&a等于下标为0对应的值的话,a取地址+1 想当于移动了5个元素,所以这时p=&a对应的是下标为4的下一个下标,也可以把它理解成下标为5对应的值.但是但是但是,重要的事说三遍,看到那个强制转换(int *)没各位,这是它相当于一个一级指针,然后又赋给了 int *p,所以它的指针位置不动,但是它又变成了一级指针,一次移动一个整数; *(p-1) 相当于下标望上移动一个位置,这是所指的下标为4,也就是下标为4,值为5,再*取值,解引用,5就变出来啦