8

<我知道只有当指针指向相同的内存空间(如数组)时,C 标准才允许指针比较。

如果我们取一个数组:

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

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

例子

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

2 回答 2

9

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

C99 6.5.6/8 加法运算符(已添加重点)

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

并且,专门针对指针的比较操作:

C99 6.5.8/5 关系运算符

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

于 2013-04-26T10:12:08.843 回答
4

是的,这是允许的,并且 C++ 严重依赖它(C 并没有那么多地使用它,但是在 C++ 中,表示范围的一种非常常见的方法是通过一个指针(或更一般地,一个迭代器)指向第一个元素,另一个指向超出范围末尾的元素。

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

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

于 2013-04-26T10:14:08.740 回答