我已经看到它多次断言C++标准不允许以下代码:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

在这种情况下,&array[5]是合法的C++代码吗?

如果可能的话,我想引用标准的答案。

知道它是否符合C标准也将很有趣。如果不是标准C++,为什么要决定将其与array + 5&array[4] + 1区别对待?

最佳答案

您的示例是合法的,但这仅是因为您实际上并未使用越界指针。

让我们首先处理越界指针(因为这是我最初解释您的问题的方式,在我注意到该示例使用单末尾指针代替之前):

通常,甚至不允许您创建越界指针。指针必须指向数组中的一个元素,或者指向末尾的一个元素。无处。

甚至不允许指针存在,这显然也不允许您取消引用它。

这是该标准在主题上必须说的:

5.7:5:



(强调我的)

当然,这适用于运算符(operator)+。因此,可以肯定的是,这是标准关于数组下标的内容:

5.2.1:1



当然,有一个明显的警告:您的示例实际上并未显示出越界指针。它使用“结束后一个”指针,这是不同的。允许指针存在(如上所述),但是据我所知,标准没有提及取消引用。我能找到的最接近的是3.9.2:3:



在我看来,这意味着是的,您可以合法地取消引用它,但是未指定读取或写入该位置的结果。

感谢ilproxyil在这里纠正了最后一点,回答了问题的最后一部分:

  • array + 5实际上不是
    取消引用任何东西,它只是
    创建一个指向终点的指针
    array
  • &array[4] + 1取消引用array+4(绝对安全),
    接受那个左值的地址,并且
    在该地址上添加一个
    产生最后一指针
    (但该指针永远不会
    取消引用。
  • &array[5]取消引用数组+5
    (据我所知,这是合法的,
    并导致“一个无关的对象
    数组元素类型的“”
    上面说的),然后拿
    该元素的地址,
    看起来足够合法。

  • 因此,他们做的事情并不完全相同,尽管在这种情况下,最终结果是相同的。

    关于c++ - 通过下标: legal by the C++ Standard or not?获取一个最后一个数组元素的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/988158/

    10-11 23:19
    查看更多