【问题标题】:Why do "a+1" and "&a+1" give different results when "a" is an int array?当 "a" 是一个 int 数组时,为什么 "a+1" 和 "&a+1" 会给出不同的结果?
【发布时间】:2010-06-07 12:21:46
【问题描述】:
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};

    printf("a = %u , &a = %u\n",a,&a);
    printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}

a 和 &a 如何在内部解释?

【问题讨论】:

    标签: c


    【解决方案1】:

    这两个语句都打印出地址,可能是为了解释指针运算。

    a&a 不一样,它们有不同的类型,但拥有相同的内存地址。

    &a 的类型为 int (*)[10](其作用类似于指向数组的指针)
    a 的类型为 int [10](其作用类似于指向单个元素的指针)

    因此,当您添加 1 时,请记住这些类型。指针将偏移地址包含的类型的大小。 a+1 偏移 int 的大小,即到数组中的第二个元素。 &a+1 完全超出整个数组的偏移量。

    【讨论】:

    • 这几乎就是 C 中的所有类型:算术和大小。
    • 为了完整起见,最好补充一下 &a[0] 的类型为 int * 并且行为非常类似于 a
    • @Brian R.Bondy 所以我们可以使用sizeof 来显示它们的类型差异吗?
    【解决方案2】:

    嗯,a 是数组的第一个元素的地址,&a 是数组的地址,但显然它们的地址相同。

    但是,当您从指针中添加(或减去)数字时,编译器会考虑数据的大小,因此在您的情况下(假设 int 的大小为 4 个字节)a+1 将比 a 大 4因为您将指针向前移动了一个整数,但是 &a+1 会大 40,因为您将指针向前移动了一个 10 整数数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多