数组地址的地址

时间:2017-03-26 09:48:45

标签: arrays c++11 pointers

以下执行代码将输出显示为“6”。

#include<stdio.h>

int main()
{
        int a[]={7,5,3,4,1,6};
        int *ptr=(int*)(&a+1);
        printf("%d",*(ptr-1));
        return (0);
}

我无法理解行部分“(int *)(&amp; a + 1)”是什么意思。

2 个答案:

答案 0 :(得分:1)

a6 int的数组。因此&a类型为&#34;指向6 int&#34;数组的指针或(在C ++语法中)int (*)[6]

因此,

&a + 16 int的一个(不存在的)数组的地址,该数组位于a末尾的内存中。

(int *)(&a + 1)会转换&a + 1的值,因此它的类型为int *。这会在紧接int结尾的内存中提供单个a的地址。正式&a + 1(int *)(&a + 1)具有相同的VALUE,但类型不同。

因此,

ptr - 1会提供a的最后一个元素的地址,因此打印*(ptr - 1)会给出值6(这是{的最后一个元素的值{1}})。

答案 1 :(得分:0)

如果你把它画出来可能更容易理解:

+---+---+---+---+---+---+----
| 7 | 5 | 3 | 4 | 1 | 6 | ...
+---+---+---+---+---+---+----
^                   ^   ^
|                   |   |
&a                  |   &a + 1
                    |   |
                    |   ptr
                    |
                    ptr - 1

也就是说,从&a + 1获得的指针指向超出数组的末尾。

另一件值得注意的事情是,对于任何指针(或数组)ptr和索引i,表达式*(ptr + i)等于ptr[i]。因此,当您执行(*ptr - 1)时,您实际上正在ptr[-1]恰好是6ptr[0]之前的元素。