Сравнения в порядке, арифметика и разыменование - нет (потому что вы не знаете размер базовых данных). Так что да, вы можете сравнить void указатели довольно хорошо (a) .
Однако имейте в виду, что обычно вы не сравниваете указатели, переданные функции сравнения qsort
, если вы не хотите сортировать их адреса. Но, поскольку они уже будут отсортированы в указанном порядке (будучи массивом), для этого нет особого варианта использования: -)
Обычно вы приводите указатели void к определенному указателю, а затем сравниваете то, на что они указывают . Что-то вроде:
int compfn (const void *p1, const void *p2) {
const char *str1 = *((const char **)(p1));
const char *str2 = *((const char **)(p2));
return strcmp (str1, str2);
}
Вам не нужно создавать временные файлы, такие как str1
и str2
(даже если любой приличный компилятор все равно их оптимизирует). Кроме небольшой проблемы с читабельностью, в этом нет ничего плохого:
int compfn (const void *p1, const void *p2) {
return strcmp (*((const char **)(p1)), *((const char **)(p2)));
}
(a) В соответствии с обычными правилами, указатели должны оба указывать на элементы одного и того же массива или одного элемента за этим массивом - все остальное не определено. Я упоминаю это для полноты, но, если вы используете qsort
, вы все равно будете работать с массивом.