指针比较“<”与一个超过数组对象的最后一个元素
我知道只有当指针指向同一个内存空间(如数组)时,才允许在C标准中与<
指针进行比较。
如果我们采取一个数组:
int array[10]; int *ptr = &array[0];
允许将ptr
与array+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 ++中,表示范围的一种非常常见的方法是指向一个指针(或更一般地说,一个迭代器)指向第一个元素,另一个指向范围结束的元素。
这样的指针存在是合法的,并将其与数组的其余部分进行比较。
但是,永远取消引用指针是不合法的。