Вопрос
Манштаб qsort(3)
Библиотечная рутина дает пример сортировки слов, приведенных в качестве аргументов на командной строке. Функция сравнения читает следующим образом:
static int
cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
Но что сортируется вот элементы argv
. Отказ Сейчас argv
является указателем к указателям символов, которые можно рассматривать также как таблицу указателей на символы.
Следовательно, его элементы являются указателями на символы, поэтому не должны фактические аргументы cmpstringp
Будьте указатели на Чарс, а не «указатели на указатели на Char»?
Решение
Функция обратного вызова прошла в качестве аргумента qsort()
называется, как аргументы, указатели на два значения сравнения. Если вы сортируете массив char *
(например argv[]
) тогда значения char *
(указатели на char
) и функция сравнения будет получать указатели на такие значения, то есть указатели на указатели на char
.
Другие советы
strcmp (* (char * const *) p1, * (char * const *) p2) ^^^^^^^^^^^^^^^^^^^^
Так p1
имеет тип * (char * const *)
или, удаляя * (char * const)
; а также char *const
совместимо с назначением с char *
, Так что нет проблем :-)
Нет, потому что предположительно вы бы назвали qsort
следующим образом:
qsort(&argv[0], argc, sizeof(char*), cmpstringp);
т.е. вы передаете его указатель-элемент, и элемент является const char *
.