我已经看到它多次声明,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

所以他们做的事情并不完全相同,尽管在这种情况下,最终结果是一样的.

C++相关问答推荐

了解返回函数指针的函数定义

如何避免使用相对路径包含在c中

getchar读css + z还是返回css?

丑陋的三重间接:可扩展的缓冲区管理 struct

变量>;-1如何在C中准确求值?

如何在C宏中确定 struct 中元素的类型?

如何在C中使printf不刷新标准输出?

在C++中使用函数指针的正确语法

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

整型文字后缀在左移中的用途

进程在写入管道时挂起

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

Fprintf正在写入多个 struct 成员,并且数据过剩

将复合文字数组用作临时字符串缓冲区是否合理?

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

无法理解 fgets 输出

子进程不会修改父进程中的统计信息

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?