Внутренняя реализация Qsort

qsort объявляется как

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 

Я хочу знать, как qsort реализует свойство отражения. Я имею в виду, как он вызывает функцию, имя которой мы передали?

qsort получает указатель на функцию, получающую два указателя и возвращающий int , и это именно так. Этот указатель называется compar . Все, что нужно сделать qsort для вызова этой функции, это что-то вроде:

 (*compar)(base+i, base+j); 

Где i и j – смещения base . Это действительно так просто. Вы можете увидеть возможную реализацию во втором издании K & R, раздел 5.11, стр. 120:

 void qsort(void *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int, int); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) /* Here's the function call */ swap(v, ++last, i); swap(v, left, last); qsort(v, left, last-1, comp); qsort(v, last+1, right, comp); } 

то, что qsort получает, является указателем на функцию, поэтому все, что ему нужно сделать, чтобы использовать эту функцию, – это сортировка разыменования этого указателя.