首页 > 解决方案 > 递增内存地址如何影响指针

问题描述

我正在寻找关于增加地址如何影响指针的解释。

通过考虑指针类型,我了解了 C 指针的工作原理以及如何递增指针。还是不明白下面的案例

int main()
{
    int a[] = {1,2,3,4,5};
    int *p = (int*)(&a+1);
    printf("%d\n%d\n", *(a+1), *(p-1));
    return 0;
}

我期待这条线

int *p = (int*)(&a+1);

p指出 array 后面的地址,a因此我期望输出:

2 

因为它很简单a[1]

但输出是unknown_number -因为我不知道哪个 int 落后 4 个字节(&a+1)

实际结果是:

2

5

为什么似乎p直接指向了坐在后面的记忆a

我的困惑的根源是什么?

标签: cpointersmemorymemory-managementpointer-arithmetic

解决方案


所以在这个例子&a中是类型int(*)[5]。当您向其添加 1 时,它实际上会添加sizeof(int[5])- 因为这就是指针算术的工作方式,添加偏移量会添加指向的类型的大小乘以偏移量。这就是你如何p成为 的最后一个元素a,然后将其强制转换为,int*所以现在你有一个指针指向一个整数,该地址位于 的最后一个元素之后的地址a。如此有效,从中减去 1 即可得到a.


推荐阅读