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