Если это помогает держать вещи прямо в голове, тип, к которому вы должны привести указатели в компараторе, совпадает с исходным типом указателя данных, который вы передаете в qsort
(который qsort docs вызывает base
). Но для того, чтобы qsort
был общим, он просто обрабатывает все как void*
, независимо от того, что это «на самом деле».
Итак, если вы сортируете массив целых чисел, вы передадите int*
(преобразованное в void*
). qsort вернет вам два void*
указателя на компаратор, который вы конвертируете в int*
, и разыменование для получения значений int
, которые вы фактически сравниваете.
Теперь замените int
на char*
:
если вы сортируете массив char*
, тогда вы передадите char**
(преобразованное в void*
). qsort вернет вам два void*
указателя на компаратор, который вы конвертируете в char**
, и разыменование для получения значений char*
, которые вы фактически сравниваете.
В вашем примере, поскольку вы используете массив, передаваемый вами char**
является результатом того, что массив char*
"затухает" до указателя на его первый элемент. Поскольку первый элемент - char*
, указатель на него - char**
.