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

时间:2012-07-05 22:13:15

标签: c parameters parameter-passing void-pointers qsort

以下代码取自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中调用它时,没有传递参数。 ab的值如何传递给函数?感谢

3 个答案:

答案 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