2016-09-10 3 views
0

Поскольку я был смущен, может ли кто-нибудь объяснить мне, что *(int*)a или *(int*)b приведен в следующем примере, введите листинг или какое-нибудь сложное объявление указателя? Мне нужно использовать функцию bsearch. ThanksСложное определение в C

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

Это Кастинг 'аннулируется *' к 'междунару *' затем разыменования его для доступа к 'int' он указует. Предположительно, известно, что эти аргументы 'void *' указывают на 'int'. – Dmitri

+0

Вы не можете иметь объявление в середине выражения. '(int *)' переводит в указатель-на-int; '*' перед этим разыгрывает указатель. – melpomene

+2

В качестве побочного примечания использование вычитания для проверки того, какая 'int' больше, не является надежной, если вы не можете быть уверены, что вычитание не будет переполняться/переполняться. – Dmitri

ответ

3

Это отливка. a, который имеет тип const void *, сначала отливают в int *, затем int * разыменовывают, чтобы читать int.

разбив его:

  • a: Тип const void *
  • (int *)a Тип int *
  • *(int *)a: тип int.

Причина это сделано потому, что функция типа int (*)(const void *, const void *) требуется передать в bsearch и qsort функций в качестве обратного вызова. Определение аргументов как const void * позволяет qsort сортировать любые произвольные данные, используя функцию обратного вызова, передавая аргументы соответствующему типу.

0

Более читаемая версия без явного (и потенциально опасного) проливает бы

int cmpfunc(const void * a_, const void * b_) 
{ 
    int const *a = a_; 
    int const *b = b_; 

    return *a - *b; 
} 
Смежные вопросы