#include <stdlib.h>
int int_sorter( const void *first_arg, const void *second_arg )
{
int first = *(int*)first_arg;
int second = *(int*)second_arg;
if ( first < second )
{
return -1;
}
else if ( first == second )
{
return 0;
}
else
{
return 1;
}
}
int main()
{
int array[10];
int i;
/* fill array */
for ( i = 0; i < 10; ++i )
{
array[ i ] = 10 - i;
}
qsort( array, 10 , sizeof( int ), int_sorter );
for ( i = 0; i < 10; ++i )
{
printf ( "%d\n" ,array[ i ] );
}
}
我不明白这一行:
int first = *(int*)first_arg;
有谁可以帮助我?解释一下?非常感谢!!!
这是一个演员吗?显式广告,从void*
到int
?但为什么我们需要()
之外的&符号?
答案 0 :(得分:9)
您首先将void指针强制转换为int指针:
(int*)first_arg
然后取消引用指针:*(int*)first_arg
以获取它指向的整数。然后将其分配给整数变量。
答案 1 :(得分:3)
int first = *(int*)first_arg;
与:
相同int* ptrToFirst = (int*)first_arg;
这是从const void *到int的显式转换。
int first = *ptrToFirst;
此处*
是解除引用运算符。这个发音是'明星'。
这是'&符号':'&amp;'。
我们为什么要这样做? qsort()需要让回调确定排序。通过将值间接作为const void指针传递,回调的参数具有固定大小,即使值可以是任何大小。这就是为什么值需要在回调中回放。