在C中使用指针

Ang*_*gus 8 c pointers

#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.

请帮我理解这个概念.

pho*_*xis 9

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).