Правильна ли справочная страница qsort (3)? - PullRequest
4 голосов
/ 10 ноября 2010

Страница руководства библиотечной подпрограммы 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 быть указателями на символы, а не "указателями на указатели на символы"?

Ответы [ 3 ]

7 голосов
/ 10 ноября 2010

Функция обратного вызова, переданная в качестве аргумента qsort(), вызывается с аргументами, указывает на два значения для сравнения. Если вы сортируете массив по char * (например, argv[]), тогда значения равны char * (указатели на char), и функция сравнения будет получать указатели на такие значения, т.е. 1009 *

2 голосов
/ 10 ноября 2010
strcmp(* (char * const *) p1, * (char * const *) p2)
       ^^^^^^^^^^^^^^^^^^^^^

То есть p1 имеет тип * (char * const *) или, удалив * 's (char * const); и char *const совместимо с присвоением с char *, поэтому нет проблем: -)

0 голосов
/ 10 ноября 2010

Нет, потому что, вероятно, вы бы назвали qsort следующим образом:

qsort(&argv[0], argc, sizeof(char*), cmpstringp);

т.е. вы передаете ему указатель на элемент, а элементом является const char *.

...