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