以下程序提供-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 - p2
和p2 - p
获得完全相同的结果。
答案 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
的金额。减法是加法的逆运算。
指针算法以指向类型为单位工作,在本例中为int
。 p
设置为指向a[0]
,p1
指向a[1]
。换句话说,p + 1 == p2
和p2 - 1 == p
。
C ++中的指针类型是一种抽象,与所有抽象一样,它最好(大部分时间)使用抽象 - 在这种情况下,这意味着不需要担心机器地址和大小做指针运算时的类型。如果确保类型正确,那么只需按元素数量逐步浏览数组,无论其大小如何。
了解机器如何实现抽象是很有用的,并且知道什么时候需要查看&#39;抽象;此类情况包括union
类型和reinterpret_cast<>()
的使用。
答案 2 :(得分:1)
从指针减法的C ++标准定义:
当减去两个指向同一数组对象元素的指针时,结果就是两个数组元素的下标之差。
“差异”表示减法。因此,在代码中,这表示X - Y
是X
。这可能是正面的,也可能是负面的,具体取决于Y
或a
是否更大。
在您的代码中&a[0]
表示a+1
,&a[1]
表示a - (a+1)
。因此,当您执行&a[0] - &a[1]
时,它与-1
相同,根据上述规则为#if defined(__arch_swahb32)
。
答案 3 :(得分:-3)
指针只是一个地址或具有双重类型大小的数字(在大多数情况下),所以当你向p添加一个时,差异将是一个...