我已经看到它多次声明,C++代码不允许使用以下代码:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
在这个上下文中有&array[5]
个合法C++代码吗?
如果可能的话,我想要一个参考标准的答案.
了解它是否符合C标准也很有趣.如果它不是标准C++,为什么要做出不同于array + 5
或&array[4] + 1
的决定呢?
我已经看到它多次声明,C++代码不允许使用以下代码:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
在这个上下文中有&array[5]
个合法C++代码吗?
如果可能的话,我想要一个参考标准的答案.
了解它是否符合C标准也很有趣.如果它不是标准C++,为什么要做出不同于array + 5
或&array[4] + 1
的决定呢?
您的示例是合法的,但这只是因为您实际上没有使用越界指针.
让我们先来处理越界指针(因为我最初是这样解释你的问题的,在我注意到这个例子使用了一个超过结束指针的指针之前):
一般来说,你甚至不允许在一个越界指针上输入create.指针必须指向数组中的元素,或one past the end.没有别的地方.
指针甚至不允许存在,这意味着显然也不允许取消对它的引用.
以下是标准在这个问题上的表述:
5.7:5:
当一个有积分的表达式
(我的)
当然,这是针对操作员+的.因此,为了确认一下,以下是该标准对数组下标的规定:
5.2.1:1:
表达式
E1[E2]
(定义上)与*((E1)+(E2))
相同
当然,有一个明显的警告:您的示例实际上并没有显示越界指针.它使用了一个"结束后一个"指针,这是不同的.指针是允许存在的(如上所述),但就我所见,标准中没有提到取消引用它.我能找到的最接近的是3.9.2:3:
[注意:例如,超过数组(5.7)末尾一个的地址将被视为
在我看来,这似乎意味着,是的,你可以合法地取消引用它,但读或写到该位置的结果是未知的.
感谢ilproxyil在这里纠正了最后一点,回答了您问题的最后一部分:
array + 5
并不意味着&array[4] + 1
次取消引用&array[5]
解引用数组+5所以他们做的事情并不完全相同,尽管在这种情况下,最终结果是一样的.