数组偏移
无意间看到一道题,所以赶紧简单总结一下数组偏移的知识,虽然理解起来还是比较简单,但时间长了容易忘记,而且在笔试中也经常出现。
/*
a是数组的首地址,也是首元素a[0]的地址。
*a取的才是数组首元素。*(&a)是非法操作。
a+1是数组a[1]的地址。
&a是数组的首地址
&a+1是下一个数组的首地址,这里要注意数组越界。
*(&a+1)表示偏移整个数组大小,把下一个数组的首地址里的值取出来。
*/
demo 1
#include<stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1);//这里已经越界
printf("%d,%d\n",*(a+1),*(ptr-1));
//ptr-1回到元素5的位置,ptr-5回到元素1的位置
return 0;
}
demo 2
#include<stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
printf("%d\n",*(&a+1)); //已经越界,所在地方没有数值
printf("%d",*(a+1)); //结果是2。
return 0;
}
关于数组偏移,先写到这。以后遇到再回到这里更新,包括二维数组偏移。欢迎评论区讨论。