【问题标题】:How does the following increment in address work .. [duplicate]以下地址增量如何工作.. [重复]
【发布时间】:2025-12-02 04:45:01
【问题描述】:
$ cat try1.c

#include<stdio.h>
void main()
{
        int arr[]={1,2,3,4};
        printf("%lu--%lu--%lu--%lu\n", arr, arr+1, &arr, &arr+1);
}

$ gcc try1.c -o try1
$ ./try1
140736912750144--140736912750148--140736912750144--140736912750160
$ ./try1
140735606483504--140735606483508--140735606483504--140735606483520
$

&arr 给出数组的基地址,即第 0 个元素地址.. 但是为什么 &arr+1 会随着数组的大小而不是 1 sizeof(int) 即 4B 而增加。

【问题讨论】:

    标签: c


    【解决方案1】:

    &arr 给出数组的基地址,即第 0 个元素地址

    &amp;arr 为您提供与&amp;arr[0] 相同的地址,但这并不意味着指针类型相同。 arr 隐式转换为int *,其中&amp;arr 的类型为int(*)[4]。根据指针算术 + 1 在第一种情况下为您提供基址 +sizeof(int),在第二种情况下为您提供+sizeof(int[4])

    【讨论】:

      【解决方案2】:

      arr + 1 中,arr 是一个衰减为指针的数组。指向int 的指针。所以arr + 1就是arr[1]的地址。

      &amp;arr + 1 中,您获取arr 的地址,它是指向长度为4 的int 数组的指针。然后您递增该指针。因为该指针是指向长度为 4 的 int 数组的指针,所以 &amp;arr + 1 是刚刚超过 arr 末尾的地址。

      【讨论】:

      • 实际上它归结为'+'第一次添加 sizeof(int) 和 sizeof(int[4]) 第二次。优先级是次要的。
      • @david.pfx 好的。如果优先级相反,那么&amp;arr+1 将毫无意义。我删除了该评论。