Вопрос

Манштаб 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 *.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top