位置与可执行操作
指针让程序间接访问对象,或在允许的情况下指向函数。以C++为例,指针值可以表示对象或函数、对象尾后位置、空指针以及无效指针;这些类别允许的操作并不相同。
指针也不能一概理解为普通整数。C++工作草案把值的表示交给实现,并区分指针值所指的对象与存储地址。具体语言和平台的约定决定可进行的转换与访问,不能从某种机器的布局推出所有实现都相同。
参考:[1]
尾后位置可以标记边界
尾后指针可以用于表示序列结束,却不是一个可直接读取的额外数组元素。两个值即使呈现相同地址,也不代表它们都合法地指向该地址上的对象,访问仍须符合指针所属对象和数组的约束。
存储被释放以后,保留下来的地址也不会继续赋予原对象的访问权。对象生命周期与存储有效期需要分别考虑;一个仍能打印出地址的变量,完全可能已经不能合法地解引用。
复制位置不等于复制所有权
多个指针可以涉及同一对象,但这本身没有说明谁负责释放,也没有说明这些访问能否同时进行。资源所有权、可变访问和生命周期约束,需要通过类型、接口或额外管理规则表达。
Rust的引用以借用规则限制有效访问;裸指针相关的unsafe代码则必须维护相应安全条件。C++资源句柄也可以封装释放责任。因此,是否使用指针,与是否具有清晰的资源管理契约,是两个需要同时回答的问题。