以下代码取自here。
* qsort example */
#include <stdio.h>
#include <stdlib.h>
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
我们在签名中有一个带参数的比较函数,但是当我们在qsort中调用它时,没有传递参数。 a
和b
的值如何传递给函数?感谢
答案 0 :(得分:4)
在此表达式的上下文中:
qsort (values, 6, sizeof(int), compare);
标识函数的子表达式compare
衰减为指向该函数的指针(而不是函数调用)。该代码实际上等同于:
qsort (values, 6, sizeof(int), &compare);
当用作函数的参数时,这与数组发生的情况完全相同(您可能以前可能会看到或者之前没有看到,但是更常见):
void f( int * x );
int main() {
int array[10];
f( array ); // f( &array[0] )
}
答案 1 :(得分:3)
调用qsort时,你传递一个指向函数的指针,这就是你没有指定任何参数的原因。
在qsort实现中,从'values'数组中选择值并调用'compare'函数。这就是“a”和“b”的传递方式。
答案 2 :(得分:1)
qsort
传递要比较的数组中的任何项目的地址。例如,&values[3]
和&values[5]
。
由于它并不真正了解数组中项的实际类型,因此它使用size
参数来正确计算地址。请参阅此实现,例如:http://insanecoding.blogspot.ie/2007/03/quicksort.html