Я читаю «Язык программирования C», второе издание.Я немного озадачен приведением типов для массивов указателей.Оригинальный полный код можно найти по адресу здесь .
char *lineptr[100];
void qsort(void *lineptr[], int left, int right, int (*comp)(void *, void *));
main()
{
//some code are omitted
//usage 1, original code in the book
qsort((void **) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ?numcmp : strcmp));
//usage 2, my understanding
qsort((void *) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ?numcmp : strcmp));
}
Автор сказал: «Любой указатель может быть приведен к void *
и обратно без потери информации, поэтому мы можем вызватьqsort
путем приведения аргументов к void *
. "(глава 5.11)
Я проверил, что и использование 1, и использование 2 могут успешно выполняться.Я знаю, использование 1 должно быть правильным, но как насчет использования 2?По моему мнению, использование 2 должно быть правильным для приведения lineptr
к void *
.В чем разница между (void **) lineptr
и (void *) lineptr
в этом случае?