c - 为什么指针可接受的指向超出有效对象的一个位置?
问题描述
在 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
解决方案
支持“一个超越最后一个”使处理数组更简单。例如,如果使用指向Start
某个元素的指针调用函数,它可能需要准备一个结束指针End
并使用如下循环:
for (ElementType *p = Start; p < End; ++p)
为此,End
必须是一个有效的指针。
我们可能会考虑设置End
为要处理的最后一个元素,而不是超出它的元素,并使用:
for (ElementType *p = Start; p <= End; ++p)
但是,请注意,在处理完最终元素后,p
将递增到Beyond End
。那么,为了p <= End
成为一个有效的表达式,p
必须是一个有效的指针。因此,我们需要能够在数组的最后一个元素之外进行地址算术运算。
推荐阅读
- android - 在列表视图中加载每个项目的所有数据还是只加载需要的信息?
- python - 我的 python 代码偶尔需要 15 毫秒来执行一个空方法
- regex - 在bash中使用正则表达式从字符串中获取值
- ios - 健康包权限返回错误值 ios Bug?
- c - 这些 char 数组声明背后发生了什么?
- java - 在用户设置的特定日期更新表格
- asp.net-mvc - 剑道网格的 Antixss
- r - 如何在不考虑 Na 值的情况下返回多列并按 R 中的其他列名称分组?
- python - 在 centos 上安装 cx-oracle 和 dev-tools
- android - 推动页脚视图的软键盘