为什么不需要将参数传递给qsort比较器函数?

以下代码取自此处 。

* qsort example */ #include  #include  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中调用它时,没有传递参数。 ab的值如何传递给函数? 谢谢

在这个表达式的上下文中:

 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] ) } 

当调用qsort时,你传递一个指向函数的指针,这就是你没有指定任何参数的原因。

在qsort实现中,从’values’数组中选择值并调用’compare’函数。 这就是“a”和“b”的传递方式。

qsort传递要比较的数组中的任何项目的地址。 例如, &values[3]&values[5]

由于它并不真正知道数组中项的实际类型,因此它使用size参数来正确计算地址。 请参阅此实现,例如: http : //insanecoding.blogspot.ie/2007/03/quicksort.html