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

shr*_*dha 10 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ndy 21

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

a并且&a不一样,它们有不同的类型,但保持相同的内存地址.

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

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


Bob*_*Bob 12

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

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