我知道只有当指针指向同一个内存空间(如数组)时才允许在C标准中与<
进行指针比较。
如果我们拿一个数组:
int array[10];
int *ptr = &array[0];
是否允许将ptr
与array+10
进行比较? array+10
指针是否在数组内存之外被考虑,因此不允许进行比较?
例如
for(ptr=&array[0]; ptr<(array+10); ptr++) {...}
答案 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 ++中,表示范围的一种非常常见的方法是使用指针(或更一般地说,是迭代器)指向第一个元素,另一个指向过去范围的结尾。
这样的指针存在是合法的,并将其与数组的其余部分进行比较。
但永远取消引用指针是不合法的。