Pourquoi n’avez-vous pas besoin de passer des arguments à une fonction de comparateur qsort?

Code ci-dessous pris à partir d’ ici .

* 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; } 

Nous avons une fonction de comparaison avec des parameters dans sa signature mais lorsque nous l’appelons dans qsort, aucun argument n’est transmis. Comment les valeurs de a et b passées à la fonction? Merci

Dans le contexte de cette expression:

 qsort (values, 6, sizeof(int), compare); 

la compare sous-expression qui identifie une fonction se décompose en un pointeur sur cette fonction (et non un appel de fonction). Le code est effectivement équivalent à:

 qsort (values, 6, sizeof(int), &compare); 

C’est exactement la même chose qui arrive aux tableaux lorsqu’ils sont utilisés comme arguments d’une fonction (que vous avez peut-être déjà vus ou que vous n’avez pas vues auparavant, mais que vous demandez plus souvent):

 void f( int * x ); int main() { int array[10]; f( array ); // f( &array[0] ) } 

Lorsque vous appelez qsort, vous passez un pointeur sur la fonction, raison pour laquelle vous ne spécifiez aucun paramètre.

À l’intérieur de l’implémentation qsort, sélectionne les valeurs dans le tableau ‘values’ et appelle la fonction ‘compare’. C’est comme ça que ‘a’ et ‘b’ sont passés.

qsort transmet les adresses des éléments du tableau à comparer. Par exemple, &values[3] et &values[5] .

Comme il ne connaît pas vraiment les types réels des éléments du tableau, il utilise le paramètre size pour calculer correctement les adresses. Voir cette implémentation par exemple: http://insanecoding.blogspot.ie/2007/03/quicksort.html