指针比较"<"与一个超过数组对象的最后一个元素

MOH*_*MED 8 c c++ comparison pointers

我知道<只有当指针指向相同的内存空间(如数组)时才允许在C标准中使用指针比较.

如果我们采取一个数组:

int array[10];
int *ptr = &array[0];
Run Code Online (Sandbox Code Playgroud)

在比较 ptr,以array+10允许吗?array+10指针是否在数组内存之外被考虑,因此不允许进行比较?

for(ptr=&array[0]; ptr<(array+10); ptr++) {...}
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 8

是的,允许指针指向刚好超过数组末尾的位置.但是,不允许您遵循这样的指针.

C99 6.5.6/8附加运营商(重点增加)

如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过数组对象的最后一个元素,则表达式(Q)-1指向数组对象的最后一个元素.如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.如果结果指向数组对象的最后一个元素之后,则不应将其用作已计算的一元*运算符的操作数.

并且,特别是对指针的比较操作:

C99 6.5.8/5关系运算符

如果表达式P指向数组对象的元素,并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比较大于P.在所有其他情况下,行为是未定义的.

  • @MOHAMED你的意思是*之前*第一个元素?不,那是严格禁止的:) (3认同)
  • @MOHAMED阅读这个答案.上面引用的6.5.6/8表示你需要知道的一切.如果操作数和结果未指向数组或超过最后一个元素,则评估未定义.换句话说,在元素开始之前的**是未定义的. (3认同)