5

请看下面的代码片段:

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;

}

当它运行时,它会输出:

arr[i] 3219650892 

 arr[i] 3219650896 

 arr[i] 3219650900 

 arr[i] 3219650904 

 arr[i] 3219650908 

 *******************
3219650912 

似乎它向我展示了最后一个元素的地址,再加上 1 个整数,这似乎很奇怪。我觉得它应该给我第二个元素的地址。

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

4

3 回答 3

10

要理解这一点,请比较arrwith的含义&arr

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

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

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

printf("%p ", (void *) (&arr+1));

脚注

*这是其中一种特殊情况:当数组与 一起使用时&,转换未完成。其中&arrarr是数组,不是指针,&arr是它的地址。

于 2013-04-21T16:17:30.170 回答
3

&arr+1

&arr是指向数组的指针arr,因此指向数组元素&arr + 1的最后一个元素的地址。那是最后一个元素地址,所以是相同的地址(但类型不同)。arr+ 1arr&arr[4]&arr + 1&arr[5]

于 2013-04-21T16:12:34.850 回答
0

&arr 为您提供指向 5 个整数数组的指针。

因此, &arr+1 指向下一个由 5 个整数组成的数组。

于 2013-04-21T16:15:08.010 回答