Первый аргумент qsort
- *p_to_pointers
.Это то же самое, что p_to_pointers[0]
, который вы установили на &p_to_nums[0]
.Это, в свою очередь, то же самое, что и p_to_nums
.Таким образом, вы звоните на qsort
в итоге эквивалентно
qsort(p_to_nums, 5, sizeof(int), compare_values);
Таким образом, вы сортируете p_to_nums
.
То, что вы хотите, это
qsort(p_to_pointers, 5, sizeof(int*), compare_values);
Тогдаваше сравнение_значений должно конвертировать void*
в int**
, а не int*
, и вам нужен дополнительный уровень косвенности в ваших разыменованиях.Обычный способ выполнить сравнение будет примерно таким:
int compare_values (const void *a, const void *b) {
const int **int_a = a;
const int **int_b = b;
return **int_b - **int_a;
}
Обратите внимание, что в C приведение от void*
не является необходимым (хотя в C ++ они есть).Также обратите внимание на более типичное вычитание в выражении return
, а не на вашу довольно необычную конструкцию (хотя ваша работает).