想要了解C数组的行为

MAG*_*MAG 5 c arrays memory-address

请参阅以下代码段:

int main()
{

    int arr[] = { 0,3 , 4,28,1198};
    for(int i=0;i<5;i++)
    printf("\n arr[i] %u \n" , arr+i);
    printf("\n *******************\n");
    printf("%u ", &arr+1);

    return 1;

}
Run Code Online (Sandbox Code Playgroud)

当它运行时,它输出:

arr[i] 3219650892 

 arr[i] 3219650896 

 arr[i] 3219650900 

 arr[i] 3219650904 

 arr[i] 3219650908 

 *******************
3219650912 
Run Code Online (Sandbox Code Playgroud)

似乎它向我展示了最后一个元素的地址添加了1个更多的整数,这看起来很奇怪.我觉得应该给我第二个元素的地址.

你能帮我理解一下这种行为吗?

Eri*_*hil 10

要理解这一点,比较的意义arr&arr.

arr是数组的名称.C有一个规则,即数组表达式转换为指向第一个元素的指针(在某些特殊情况下,这里不适用).所以arr转换为&arr[0]第一个元素的地址.这是一个指针int,因此,当你向它添加1时,你会得到一个指向下一个的指针int.因此,该指针的连续增量通过数组的元素递增.

相反,&arr是指向数组的指针.*数组的起始地址和第一个元素的起始地址相同,但它们具有不同的类型.类型&arr是"指向五个int数组的指针".当你向它添加1时,你得到一个指向下一个五个int数组的指针.也就是说,地址增加了整个五个int数组的大小.

顺便说一句,使用%u说明符打印地址是不合适的.您应该使用%p并转换地址void *,例如:

printf("%p ", (void *) (&arr+1));
Run Code Online (Sandbox Code Playgroud)

脚注

*这是特殊情况之一:使用数组时&,转换不会完成.In &arr,arr是数组,而不是指针,&arr是它的地址.