为什么不需要将参数传递给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中调用它时,没有传递参数。 a
和b
的值如何传递给函数? 谢谢
在这个表达式的上下文中:
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