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

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

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

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

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

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

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

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