首页 > 解决方案 > 为什么指针可接受的指向超出有效对象的一个​​位置?

问题描述

在 Jens Gustedt 的教科书“Modern C”中,我读到了“指针必须指向有效对象或超出有效对象的一个​​位置或为空”的指针。为什么指向有效对象之外的一个位置是可以接受的?例如:

int array[5] = {0};
int* p = array;
p = array + 5 // points to a valid location
p = array + 6 // points to an invalid location

标签: cpointers

解决方案


支持“一个超越最后一个”使处理数组更简单。例如,如果使用指向Start某个元素的指针调用函数,它可能需要准备一个结束指针End并使用如下循环:

for (ElementType *p = Start; p < End; ++p)

为此,End必须是一个有效的指针。

我们可能会考虑设置End为要处理的最后一个元素,而不是超出它的元素,并使用:

for (ElementType *p = Start; p <= End; ++p)

但是,请注意,在处理完最终元素后,p将递增到Beyond End。那么,为了p <= End成为一个有效的表达式,p必须是一个有效的指针。因此,我们需要能够在数组的最后一个元素之外进行地址算术运算。


推荐阅读