2015-06-03 51 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