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
是它的地址.