为什么可以比较最后一个元素?

wul*_*pro 3 c c++ memory pointers

标准规定:

除非两个指针指向同一个数组对象的元素或者指向数组对象的最后一个元素之后,否则行为是未定义的.

为什么在最后一个元素之后引用一个是有效的?

Sto*_*ica 5

可以计算该指针并仅与其进行比较.原因是它可以用于使用一对指针传递和迭代和数组.

如果标准不允许,那么仅仅存在以下循环就会表现出不确定的行为 pend

int arr[100] = {0};

for (int *pbegin = arr, *pend = arr + 100; pbegin != pend; ++pbegin)
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这在C++中尤为重要,其中标准库大量使用将范围作为"开头的迭代器和一个结尾"的惯用法.

  • @wulfgarpro在编写标准时,一个过去的指针很有用,并且已经在所有现有的实现上工作.当你不止一个时,这不是很有用,并且有些实现会破坏它(尽管你可能需要超过两个结束时)或者表现出标准无法描述的方式(例如再次指向`arr`,所以标准化没有意义. (3认同)