1

下面的代码取自这里

* 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传递给函数的?谢谢

4

3 回答 3

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] )
}
于 2012-07-05T22:18:46.267 回答
3

调用 qsort 时,您将传递一个指向函数的指针,这就是您不指定任何参数的原因。

在 qsort 实现中,从“values”数组中选择值并调用“compare”函数。这就是'a'和'b'如何通过。

于 2012-07-05T22:16:15.293 回答
1

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

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

于 2012-07-05T22:15:02.627 回答