代码之家  ›  专栏  ›  技术社区  ›  user2138149

如果指向同一类型的两个指针指向不同数组中的项,那么减去这两个指针是否有意义?

  •  0
  • user2138149  · 技术社区  · 4 月前

    这是一个有点愚蠢的问题,但我认为它很有趣。

    我在尝试指针和对齐,想知道是否有可能减去两个不同的指针,每个指针都指向不同数组中的项。

    减去两个指针通常会产生一个值,该值表示数组中两个项目之间的元素数量。

    例如,以下是一些按预期工作的有效代码:

    unsigned short *p_short = new unsigned short[100];
    unsigned short *p_1 = &p_short[10];
    unsigned short *p_2 = &p_short[20];
    
    std::cout << p_2 - p_1 << std::endl;
    // should produce the value `10`.
    // There are 10 `unsigned short`s between the
    // two pointers.
    // Note: NOT `20`. The subtraction does not
    // calulate the number of bytes between the
    // two pointers.
    
    • 它是 如果数组是不同类型的数组,则可能。这会产生类型错误。
    • 如果指针类型相同,但指向不同数组的元素,则可能。

    然而,在后一种情况下,减法的结果有意义吗?

    输出的可能示例:这是一个可能不太可能产生有意义结果的示例。

    auto p1 = new unsigned short[100];
    auto p2 = new unsigned short[100];
    std::cout << p2 - p1 << std::endl;
    

    输出: 104 .

    (但是我看到了其他值,例如 -6148914691236517216 .)

    2 回复  |  直到 4 月前
        1
  •  5
  •   BrokenBenchmark Miles Budnek    4 月前

    结果不仅毫无意义,还会导致未定义的行为:

    [expr.add] :

    当两个指针表达式 P Q 则结果的类型是实现定义的带符号积分类型;此类型应与定义的类型相同 std​::​ptrdiff_t <cstddef> 标题([support.types.layout])。

    • 如果 P Q 两者都计算为空指针值,结果为0。
    • 否则,如果 P Q 分别指向数组元素 i j 同一数组对象 x ,表达 P - Q 具有价值 i−j .
    • 否则,行为未定义。
        2
  •  0
  •   Chris    4 月前

    指向不同数组中项的指针之间的任何指针算术都将是 undefined behavior .

    鉴于此,您看到的任何结果都是有效的结果。

        3
  •  0
  •   Andreas Wenzel    4 月前

    减去指向不同对象的两个指针的行为是未定义的。另一个答案引用了C++标准的相关部分。

    然而,在大多数平台上,你得到的结果将是指针指向的两个地址之间的差值除以指针指向的对象大小。如果结果为负,则这可能意味着第一个操作数指向的地址低于第二个操作数。

    推荐文章