簡體   English   中英

為什么減去指針時得到負數?

[英]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 - p2p2 - 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 == p2p2 - 1 == p

C ++中的指針類型是一種抽象,與所有抽象一樣,最好(大部分時間)使用抽象 - 在這種情況下,這意味着在進行指針運算時不需要擔心機器地址和類型的大小。 如果確保類型正確,則只需按元素數量逐步瀏覽數組,無論其大小如何。

理解抽象如何由機器實現是很有用的,並且知道何時需要在抽象下“查看”​​是必不可少的; 這種情況包括union類型和reinterpret_cast<>()

從指針減法的C ++標准定義:

當減去指向同一數組對象的元素的兩個指針時,結果是兩個數組元素的下標的差異。

“差異”意味着減法。 所以在代碼中,這表示&arr[X] - &arr[Y]X - Y 這可能是正面的還是負面的,這取決於XY是否更大。

在你的代碼中, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM