【问题标题】:Address of address of a array数组地址的地址
【发布时间】:2017-03-26 09:48:45
【问题描述】:

以下执行代码给出的输出为“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*)(&a+1)”是什么意思。

【问题讨论】:

  • 这意味着“我不害怕未定义的行为。我会进行强制转换,直到它编译为止。”这不是你应该做的事情。

标签: arrays c++11 pointers


【解决方案1】:

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

因此,&amp;a + 16 int 的(不存在的)数组的地址,该数组在内存中紧接在a 的末尾之后。

(int *)(&amp;a + 1) 转换&amp;a + 1 的值,使其具有int * 类型。这给出了单个int 的地址,它在内存中紧接a 的末尾。形式上,&amp;a + 1(int *)(&amp;a + 1) 具有相同的 VALUE,但类型不同。

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

【讨论】:

  • 但是'a'本身不是指针/地址吗?如果是,那么指针的地址是什么意思?
  • 没有。 a 是一个数组。指针是包含地址的变量。一些(但不是全部)操作在“X 数组”和“指向 X 的指针”(其中 X 是一种类型)上给出相同的结果,但这并不意味着“数组是指针”,也不意味着“指针是一个数组”。
【解决方案2】:

画出来可能更容易理解:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 2011-02-23
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多