为什么在减去指针时得到负数?

时间:2016-12-07 12:01:47

标签: c++ pointers

以下程序提供-1,但我希望它能打印1

#include <iostream>
int main()
{
    int a[] = {0, 1};
    int* p = a;
    int* p2 = a+1;

    std::cout << p - p2 << std::endl;
    system("PAUSE");
    return 0;
}

如果我像这样交换减法:

std::cout << p2 - p << std::endl;

然后我得到了1

Pointer subtraction confusion的答案是,如果我们从指针中减去指针,我们得到位于它们之间的内存块,我不知道这可以是负面的。

我希望p - p2p2 - p获得完全相同的结果。

4 个答案:

答案 0 :(得分:3)

从p(指向第一个元素的指针)中减去p2(指向第二个元素的指针)。让我们说p是地址的内存,相当于数字1000(当转换为int时)。在大多数系统上,p2将为1000 + sizeof(int)或1004。指针算术是:

(address - address2) / sizeof(T)

其中T是您的类型。因此,当你这样做:

p - p2 //(1000 - 1004) / 4

你得到-1。如果你做相反的事情就得到1。

答案 1 :(得分:2)

您获得-1,因为这是您必须添加到p2才能达到p的金额。减法是加法的逆运算。

指针算法以指向类型为单位工作,在本例中为intp设置为指向a[0]p1指向a[1]。换句话说,p + 1 == p2p2 - 1 == p

C ++中的指针类型是一种抽象,与所有抽象一样,它最好(大部分时间)使用抽象 - 在这种情况下,这意味着不需要担心机器地址和大小做指针运算时的类型。如果确保类型正确,那么只需按元素数量逐步浏览数组,无论其大小如何。

了解机器如何实现抽象是很有用的,并且知道什么时候需要查看&#39;抽象;此类情况包括union类型和reinterpret_cast<>()的使用。

答案 2 :(得分:1)

从指针减法的C ++标准定义:

  

当减去两个指向同一数组对象元素的指针时,结果就是两个数组元素的下标之差。

“差异”表示减法。因此,在代码中,这表示X - YX。这可能是正面的,也可能是负面的,具体取决于Ya是否更大。

在您的代码中&a[0]表示a+1&a[1]表示a - (a+1)。因此,当您执行&a[0] - &a[1]时,它与-1相同,根据上述规则为#if defined(__arch_swahb32)

答案 3 :(得分:-3)

指针只是一个地址或具有双重类型大小的数字(在大多数情况下),所以当你向p添加一个时,差异将是一个...