当“a”是一个int数组时,为什么“a + 1”和“& a + 1”给出不同的结果?

时间:2010-06-07 12:21:46

标签: c

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如何在内部解释?

2 个答案:

答案 0 :(得分:21)

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

a&a不相同,它们有不同的类型,但保留相同的内存地址。

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

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

答案 1 :(得分:12)

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

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