2015-06-03 48 views
-1

我有兩個void *,即void *avoid *b。可以說a是在0x804ae0b是在0x804aec。我如何比較兩者?我想檢查地址a是否低於地址b如何比較兩個void的地址*

+7

你有沒有試過* *只是比較它們? –

+3

「我想檢查a的地址是否低於b的地址」 - 小心你的措辭。 *指針的地址*與指針*保存的地址之間存在*世界*差異。 – WhozCraig

+2

「*我想檢查a的地址是否低於b *的地址」:你確定你的意思是? 'a'本身就是一個指針,'b'也是。如果你只是想比較指針,你應該說「我想檢查一下'a'是否低於'b'」。 – ArjunShankar

回答

-1
#include <stdint.h> 

if ((uintptr_t)a < (uintptr_t)b) ... 

請注意,強制轉換爲int可能是與32位整數,但64位指針系統不足。

11

標準的運營商在void *工作太:

if (a < b) ... 
+1

它在這種情況下定義了這些指針是如何比較的?作爲有符號值還是無符號值? – dlask

+1

@dlask有符號/無符號對指針地址沒有意義,所以沒有。在機器代碼層面上,地址只是簡單地比較,並且不存在那裏存在的「已簽名」。 – Lundin

+0

@dlask指針沒有符號。他們是地址。根據標準,他們甚至不必是數字(儘管我知道的所有硬件都是)。 – ArjunShankar

0

像任何其他變量。

if(a < b)

-3

每一個地址是最終的數字,很長一個,但一個數字,所以做一個轉換爲int(64位系統)或INT64你可以比較兩個值

if((int64)a < (int64)b) 
{ 
..... 
} 
+1

您不需要將它們轉換爲整數。如果你出於某種原因需要這樣做,那麼無論如何你都應該使用uintptr_t。 – Lundin

+0

沒有必要執行這種轉換,它可能會混淆「正確的」語義,因爲它會執行有符號的比較。你可以(原則上)在無符號地址空間(通常情況下)中有一個數組,其中數組中的前b,但是 Persixty

1

您可以直接比較。

int main(void) 
{ 
    int a[]={10,20}; 
    void *p1=&a[0],*p2=&a[1]; 
    if(p1>p2) 
    printf("Crazy\n"); 
    else 
    printf("Correct\n"); 
    return 0; 
} 

預期輸出:

Correct 
+0

我已修改此答案。這是未定義的行爲。 'a'和'b'不指向同一個對象或同一個數組中的兩個對象。 – Persixty