Void指针值比较C ++

时间:2013-11-07 02:10:17

标签: c++ pointers compare void

我真正的问题是,当你真正知道这些值是同一类型时,真的可以比较两个void指针中包含的吗?例如int。

void compVoids(void *firstVal, void *secondVal){
     if (firstVal < secondVal){
          cout << "This will not make any sense as this will compare addresses, not values" << endl;
     }
} 

实际上我需要比较两个void指针值,而在函数外部,已知类型为int。我不想在函数内部使用int的比较。 所以这对我也不起作用:if (*(int*)firstVal > *(int*)secondVal) 有什么建议? 非常感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

为了比较void*指向的数据,您必须知道类型是什么。如果您知道类型是什么,则不需要void*。如果要编写可用于多种类型的函数,可以使用模板:

template<typename T>
bool compare(const T& firstVal, const T& secondVal)
{
    if (firstVal < secondVal)
    {
        // do something
    }
    return something;
}

为了说明为什么尝试比较盲指针盲是不可行的:

bool compare(void* firstVal, void* secondVal)
{
    if (*firstVal < *secondVal) // ERROR:  cannot dereference a void*
    {
        // do something
    }
    return something;
}

因此,您需要知道要比较的大小,这意味着您需要传入std::size_t参数,或者您需要知道类型(实际上,为了传递{{1}参数,你必须知道类型):

std::size_t

这在C中是必需的,因为模板不存在。 C ++有模板,这使得这种类型的函数声明变得不必要和低级(模板允许强制执行类型安全 - 无效指针不会,如下所示)。

当你做这样的事情(愚蠢)时会出现问题:

bool compare(void* firstVal, void* secondVal, std::size_t size)
{
    if (0 > memcmp(firstVal, secondVal, size))
    {
        // do something
    }
    return something;
}

int a = 5;
int b = 6;
bool test = compare(&a, &b, sizeof(int)); // you know the type!

正如您所看到的,通过这样做,您将失去所有类型的安全性,并且还有许多其他问题需要处理。

答案 1 :(得分:0)

您需要取消引用它们并使用

进行转换
if (*(int*) firstVal < *(int*) secondVal)

为什么你不想在函数内部使用int比较,如果你知道这两个值是int并且你想比较它们的int值指着?


您提到了比较函数,用于比较插入数据;对于比较功能,我建议这样做:

int
compareIntValues (void *first, void *second)
{
    return (*(int*) first - *(int*) second);
}

如果第一个较小则遵循负的约定,如果它们相等则为0,如果第一个较大则为正。当您想要比较int数据时,只需调用此函数。

答案 2 :(得分:0)

这绝对是可能的,但由于它们是无效指针,因此您必须指定要比较的数据量以及如何进行比较。

memcmp function可能正是您要找的。它需要两个void指针和一个用于比较的字节数的参数,并返回一个比较。然而,一些比较并不取决于所有数据是否相等。例如:比较两个向量的方向,忽略它们的长度。

除非您指定比较数据的方式,否则此问题没有明确答案。

答案 3 :(得分:0)

是肯定的。实际上,如果类型是unsigned int,则代码是正确的。即使不推荐,也经常使用将int值转换为void指针。

您也可以强制转换指针,但必须将它们直接转换为int类型:

if ((int)firstVal < (int)secondVal)

注意:根本没有*。

如果您构建32位和64位,可能会遇到地址模型问题。检查您可以使用的intptr_t类型以避免这种情况。

if ((intptr_t)firstVal < (intptr_t)secondVal)