2016-01-02 3 views
0

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

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

Они являются два элемента сравниваются в вашей функции. – Idos

+0

'a' и' b' являются указателями на элементы массива. – ameyCU

+1

@Idos Nitpicking: "* Это два элемента ... *" Они * не * сами два элемента сравниваются, но ссылаются на них, указывая на элементы, которые нужно сравнить. – alk

ответ

2

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

3

В этом входы * аннулируются и вам нужно 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; 
} 
+2

Вы имели в виду 'void *' не '* void', не так ли? – alk

+0

нет Я хочу просто сказать указатель void, который может принимать адрес любого типа данных – Vinod

+2

'void *' - это тип 'void'-pointer, тип указателя на' void', что '* void' не является , Фактически последнее недействительно C. – alk