cmpfunc в функции qsort() в c

Может кто-нибудь объяснить мне cmpfunc, который используется в функции qsort? Что такое a и b в этой функции и на что они указывают?

int cmpfunc(const void *a, const void *b)
{
    return(*(int*)a - *(int*)b);
}

person user007    schedule 02.01.2016    source источник
comment
Это два элемента, которые сравниваются в вашей функции.   -  person Idos    schedule 02.01.2016
comment
a и b — указатели на элементы массива.   -  person ameyCU    schedule 02.01.2016
comment
@Idos Придирки: Это два элемента ... Они не сами по себе два элемента, которые нужно сравнить, а ссылаются, указывают на сравниваемые элементы.   -  person alk    schedule 02.01.2016


Ответы (2)


a и b в cmpfunc являются указателями на тип const void. cmpfunc может принимать указатель на элементы массива любого типа данных.
void * указатель не может быть разыменован, поэтому перед разыменованием необходимо выполнить приведение int *.

person haccks    schedule 02.01.2016

В этом случае входными данными являются *void, и вам нужно comaper целые числа в вашем случае. Поэтому вам нужно будет преобразовать типы. Вот почему есть

     *(int *) a

это может быть плавающий тип

     *(float *) a 

и так далее типа...

вы можете найти эту реализацию:

 int cmpfunc(const void *a, const void *b)
 {
  if(*(int *)a  <  *(int *)b) return -1;
  if(*(int *)a  == *(int *)b) return 0;
  if(*(int *)a  >  *(int *)b) return 1; 
}
person Vinod    schedule 02.01.2016
comment
Вы имели в виду void *, а не *void, не так ли? - person alk; 02.01.2016
comment
нет, я хочу просто сказать указатель void, который может взять адрес любого типа данных - person Vinod; 02.01.2016
comment
void * — это тип указателя void, тип указателя на void, чем *void не является. На самом деле последнее недействительно C. - person alk; 02.01.2016
comment
поэтому сначала они ссылаются на указатель на элемент, а затем разыменовывают его. - person user007; 05.01.2016