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

时间:2013-04-26 10:07:19

标签: c++ c pointers comparison

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

如果我们拿一个数组:

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

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

例如

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

2 个答案:

答案 0 :(得分:8)

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

  

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

     

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

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

  

C99 6.5.8 / 5关系运算符

     

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

答案 1 :(得分:4)

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

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

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