为什么指向一个超出有效对象的位置对于指针来说是可以接受的?

Ale*_*lex 5 c pointers

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

int array[5] = {0};
int* p = array;
p = array + 5 // points to a valid location
p = array + 6 // points to an invalid location
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 12

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

for (ElementType *p = Start; p < End; ++p)
Run Code Online (Sandbox Code Playgroud)

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

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

for (ElementType *p = Start; p <= End; ++p)
Run Code Online (Sandbox Code Playgroud)

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