指针指向刚刚超过对象末尾的位置是什么意思?

时间:2014-03-02 20:34:05

标签: c++ pointers

指针指向刚好超过对象末尾的位置是什么意思?

来自C ++ Primer,第52页:

  

指针值

     

存储在指针中的值(即地址)可以处于以下四种状态之一:

     
      
  1. 它可以指向一个物体。
  2.   
  3. 它可以指向刚刚超过对象结尾的位置。
  4.   
  5. 它可以是空指针,表示它未绑定到任何对象。
  6.   
  7. 可能无效;除前三个以外的值无效。
  8.   

2 个答案:

答案 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

您可以取消引用p1p2,但尝试对p3执行相同操作会调用未定义的行为。 此外,任何基于arr的指针算法都会产生另一个指针,而不是上面提到的三个指针,意味着UB。

因此,您可以使用p3执行的唯一操作是:

  • 减去值(导致p1p2
  • 的值
  • 将其与另一个指针(if p3 == arr + 2
  • 进行比较

至于为什么它应被视为有效的原因,请考虑使用迭代器的常用方法:

for (container::iterator iter = myContainer.start(); iter != myContainer.end(); ++iter)

这里,myContainer.end()可能只是一个指向刚好超过数组末尾的元素的指针。如果它不是一个有效的指针并且整个构造都是UB,那将是一种耻辱。