C++ 指针指向刚过对象末端的位置意味着什么?

C++ 指针指向刚过对象末端的位置意味着什么?,c++,pointers,C++,Pointers,指针指向刚过对象末端的位置意味着什么 从C++引物,PG 52: 指针值 指针中存储的值(即地址)可以处于以下四种状态之一: 它可以指向一个对象 它可以指向刚好经过对象末端的位置。 它可以是空指针,指示它未绑定到任何对象 它可能是无效的;前三个以外的值无效 直接超过对象末尾的指针是一个其地址与对象地址偏移正好为对象大小的指针 由于指针算法已考虑对象的类型: T object; T *past = &object + 1; // 1 is sizeof object 或者做手工算术: T

指针指向刚过对象末端的位置意味着什么

从C++引物,PG 52:

指针值

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

  • 它可以指向一个对象
  • 它可以指向刚好经过对象末端的位置。
  • 它可以是空指针,指示它未绑定到任何对象
  • 它可能是无效的;前三个以外的值无效

  • 直接超过对象末尾的指针是一个其地址与对象地址偏移正好为对象大小的指针

    由于指针算法已考虑对象的类型:

    T object;
    T *past = &object + 1; // 1 is sizeof object
    
    或者做手工算术:

    T object;
    char *past = reinterpret_cast<char*>(&object) + sizeof object;
    
    T对象;
    char*pass=reinterpret\u cast(&object)+sizeof object;
    
    尽管在第二种情况下,由于类型的不同,正确使用指针会更加困难。

    在数组的上下文中,“超过对象的结尾”变得更加有趣

    假设您有一个两元素数组:
    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
      的值)
    • 将其与另一个指针进行比较(
      如果p3==arr+2)

    至于为什么应该被认为是有效的,考虑使用迭代器的常用方式:

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


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

    这意味着如果你减少它,它将指向数组中的最后一个对象。(单个对象被视为具有一个元素的数组。)