#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d %d\n",*(a+1),*(ptr-1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
2,5
Run Code Online (Sandbox Code Playgroud)
我无法理解如何*(ptr-1)评估为5(正确的输出).但是,当我手动做的是1,我的理解是*(ptr-1)会得到评估,以*(&a+1-1)这将
*(&a)是1.
请帮我理解这个概念.
int *ptr=(int*)(&a+1);
Run Code Online (Sandbox Code Playgroud)
使得&a + 1品牌&a + sizeof (a)为a是的类型int [5],这使得ptr指向实际a[5](无效/超出定义的限制)
(ptr - 1) 因此,点指向a[4]和*(ptr - 1)将打印5.
小智 5
在你的中printf,你通过用+1from 增加位置来检索pos 1中的值0.
在你的第二个整数中,你正在检索,5因为&a+1实际上超出了数组,所以当你这样做时*(ptr-1),它会返回5.如果你删除了-1,那么你得到一个非常奇怪的结果(在我的情况下它是-1078772784).