我已经看到它多次断言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/