[英]Why do I get a negative number when subtracting 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
。
指針減法混淆的答案說,如果我們從指針中減去指針,我們會得到位於它們之間的 memory 塊的數量,我看不出這可能是負數。
我希望p - p2
和p2 - p
得到完全相同的結果。
從p(指向第一個元素的指針)中減去p2
(指向第二個元素的指針)。 假設p
是地址處的內存,相當於數字1000(轉換為int時)。 在大多數系統中, p2
將是1000 + sizeof(int)
或1004。 指針算術是:
(address - address2) / sizeof(T)
其中T
是你的類型。 因此當你這樣做時:
p - p2 //(1000 - 1004) / 4
你得到-1。 如果你做相反的事情就得1。
得到-1
因為這是你必須添加到p2
才能達到p
。 減法是加法的逆運算。
指針算法以指向類型為單位工作,在本例中為int
。 p
設置為指向a[0]
, p1
指向a[1]
。 換句話說, p + 1 == p2
和p2 - 1 == p
。
C ++中的指針類型是一種抽象,與所有抽象一樣,最好(大部分時間)使用抽象 - 在這種情況下,這意味着在進行指針運算時不需要擔心機器地址和類型的大小。 如果確保類型正確,則只需按元素數量逐步瀏覽數組,無論其大小如何。
理解抽象如何由機器實現是很有用的,並且知道何時需要在抽象下“查看”是必不可少的; 這種情況包括union
類型和reinterpret_cast<>()
。
從指針減法的C ++標准定義:
當減去指向同一數組對象的元素的兩個指針時,結果是兩個數組元素的下標的差異。
“差異”意味着減法。 所以在代碼中,這表示&arr[X] - &arr[Y]
是X - Y
這可能是正面的還是負面的,這取決於X
或Y
是否更大。
在你的代碼中, a
表示&a[0]
, a+1
表示&a[1]
。 所以當你做a - (a+1)
它與&a[0] - &a[1]
,根據上述規則為-1
。
或許可以這樣想。 減去兩個指針,例如 p1 - p2 產生的數字,當添加到 p2 時產生 p1
指針只是一個地址或具有雙重類型大小的數字(在大多數情況下),所以當你向p添加一個時,差異將是一個...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.