0

我试图比较将 int 转换为 void* 是否有效,甚至是它们之间的比较

int i=1,j=2;
float a=1.1;

if((void *)i > (void *)j )
cout<<"i>j"<<endl;
else
cout<<"i<j"<<endl;

输出是

i<j

但是这个

if((void *)a > (void *)i )
cout<<"a>i"<<endl;
else
cout<<"a<i"<<endl;

给出错误

 error: invalid cast from type ‘float’ to type ‘void*’

我以为我们可以将任何东西转换为 void 指针?不是这样吗?

4

4 回答 4

5

void指针之间的比较,它是定义的还是依赖于编译器的?

这是明确定义的,但结果通常是未指定的,如 C++11 5.9/3 所述:“如果两个指针表示相同的地址或者都是空指针值,则如果运算符为 <=,则结果为 true或 >= 否则为 false;否则结果未指定。”

请注意std::less,即使内置运算符没有,也需要和朋友定义指针的总顺序。

但是,使用从任意整数值转换而来的指针执行任何操作都会产生未定义的行为。

我以为我们可以将任何东西转换为 void 指针?不是这样吗?

不。reinterpret_cast(或等效的 C 样式转换)可以在指针和整数类型之间转换。将浮点值转换为指针完全没有意义。

于 2013-09-03T16:51:02.617 回答
3

我以为我们可以将任何东西转换为 void 指针?不是这样吗?

Avoid*旨在允许您转换为任何对象指针类型,而不是任何类型

这意味着你可以这样做:

if((void *)&a > (void *)&i )

但是,像这样检查和比较指针值很少有用。

于 2013-09-03T16:46:53.717 回答
1

您可以将“任何东西”的地址(不是函数或其“地址”由指向成员的指针给出)转换为void *. 此外,一些整数类型可以转换为指针。我想你想做的是这个

if((void *)&i > (void *)&j )
    cout<<"i>j"<<endl;
else
    cout<<"i<j"<<endl;

然后

if((void *)&a > (void *)&i )
    cout<<"a>i"<<endl;
else
    cout<<"a<i"<<endl;

但是,请注意,根据 C++11 5.9/3 未指定此类指针比较的结果(正如Mike Seymour在他的帖子中所解释的那样。

比较相同类型的指针的最佳方法是使用模板greater, less,greater_equal并且less_equal因为 20.8.5/8 说:

对于模板greaterlessgreater_equalless_equal,任何指针类型的特化都会产生一个总顺序,即使内置运算符<><=>=没有。

因此,您应该使用

if (std::greater<void*>()((void *) &i, (void *) &j))
    cout<<"i>j"<<endl;
else
    cout<<"i<j"<<endl;
于 2013-09-03T16:48:43.577 回答
1

您可以将任何对象指针类型转换void*为非任何类型。

因此,您可以通过以下方式解决您的问题:

if((void *)&a > (void *)&i )
//         ^            ^

但是比较两个变量的地址与比较值不同。我不认为你会得到你想要的结果......你会在这里有未定义的行为

于 2013-09-03T16:51:07.127 回答