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

我知道只有当指针指向同一个内存空间(如数组)时,才允许在C标准中与<指针进行比较。

如果我们采取一个数组:

 int array[10]; int *ptr = &array[0]; 

允许将ptrarray+10进行比较? array+10指针是否在array+10内存之外考虑,因此不允许进行比较?

 for(ptr=&array[0]; ptr<(array+10); ptr++) {...} 

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

C99 6.5.6 / 8加法运算符(重点补充)

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

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

C99 6.5.8 / 5关系运算符

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

是的,这是允许的,C ++在很大程度上依赖于它(C不会使用它,但在C ++中,表示范围的一种非常常见的方法是指向一个指针(或更一般地说,一个迭代器)指向第一个元素,另一个指向范围结束的元素。

这样的指针存在是合法的,并将其与数组的其余部分进行比较。

但是,永远取消引用指针是不合法的。