[英]Why don't you need to pass arguments to a qsort comparator function?
下面的代碼是從這里獲取的 。
* 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;
}
我們有一個簽名函數中帶有參數的compare函數,但是當我們在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實現內部,從“值”數組中選擇值,然后調用“比較”功能。 這就是“ a”和“ b”的通過方式。
qsort
傳遞要比較的數組中任何項目的地址。 例如, &values[3]
和&values[5]
。
由於它實際上並不知道數組中各項的實際類型,因此它使用size
參數來正確計算地址。 例如,請參見以下實現: http : //insanecoding.blogspot.ie/2007/03/quicksort.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.