2016-04-04 167 views
-7

我目前了解的qsort函数,和我遇到的比较功能:这在C中意味着什么?

int cmpfunc (const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

我不明白为什么我们使用*(int*)a。这是什么东西,它有什么用?为什么const void *a而不是简单的int a

+2

这听起来像你在问语言的基础知识,这超出了本论坛的范围。 )a',你想要解释,'*'用来表示指针秒。请缩小你的问题,并更精确地提问一下。 - **编辑:**哦,我明白了,你是在问'*(int *)a',但不熟悉markdown语法。 –

+0

无论如何,这是一个不好的方法,因为减法可能溢出并返回错误的比较结果。坚持:比较。 –

+2

@ user5910213他确实读过它。你原来的问题只是说'(int)a',因为'*'被视为降价,你没有检查预览,看看你的问题在渲染时的样子。 – Paulpro

回答

0

你的代码是功能等价于:

int cmpfunc(const int* a, const int* b) 
{ 
    return(*a - *b); 
} 

换句话说,(int*)a蒙上你的void* a到一个整数指针类型。

+0

无论如何,这是一个糟糕的方法,因为减法可能会溢出并返回错误的比较结果。坚持:比较。 –

+0

我会认为这只是令人费解的练习代码,实际上不会在任何情况下使用。 (我希望!) –

+3

除了他的代码可以被[qsort](http://www.cplusplus.com/reference/cstdlib/qsort/)使用并且你的代码不能,因为它有错误的签名。 – Paulpro

3

由于qsort应该能够对任何类型的事物(包括结构体)进行排序,所以它会传递一个指向每个要比较的东西的指针(作为它的比较方法的参数)。这些可以是任何东西,所以使用的类型是“void *”,它可以是指向任何东西的指针。然后,您的比较方法应该将该指针投射到正确类型的指针(在本示例中,因为您正在比较两个整数,所以您将该投影指针取消引用以便比较指向的值,因此*(int *)

1

(int *)对void指针前面的变量'a'的内存地址进行类型转换,* before(int *)访问内存地址的整数值 void * a被使用,因为这是一个泛型函数,你可以用它来比较两个字符,例如: