指针指向刚好超过对象末尾的位置是什么意思?
来自C ++ Primer,第52页:
指针值
存储在指针中的值(即地址)可以处于以下四种状态之一:
- 它可以指向一个物体。
- 它可以指向刚刚超过对象结尾的位置。
- 它可以是空指针,表示它未绑定到任何对象。
- 可能无效;除前三个以外的值无效。
醇>
答案 0 :(得分:3)
指向对象末尾的指针是一个指针,其地址与对象的地址完全相同sizeof object
。
由于指针算术已经考虑了对象的类型:
T object;
T *past = &object + 1; // 1 is sizeof object
或者做手动算术:
T object;
char *past = reinterpret_cast<char*>(&object) + sizeof object;
虽然在第二种情况下,由于类型不同,正确使用指针会比较棘手。
答案 1 :(得分:2)
“过去一个对象的结尾”在数组的上下文中变得更有趣。
假设您有一个两元素数组:
int arr[2] = {1, 2}
基于arr
,你可以计算这些指针:
int * p1 = arr
int * p2 = arr + 1
int * p3 = arr + 2
您可以取消引用p1
和p2
,但尝试对p3
执行相同操作会调用未定义的行为。
此外,任何基于arr
的指针算法都会产生另一个指针,而不是上面提到的三个指针,意味着UB。
因此,您可以使用p3
执行的唯一操作是:
p1
或p2
)if p3 == arr + 2
)至于为什么它应被视为有效的原因,请考虑使用迭代器的常用方法:
for (container::iterator iter = myContainer.start(); iter != myContainer.end(); ++iter)
这里,myContainer.end()
可能只是一个指向刚好超过数组末尾的元素的指针。如果它不是一个有效的指针并且整个构造都是UB,那将是一种耻辱。