Как понять тип приведение для массивов указателей? - PullRequest
0 голосов
/ 16 мая 2019

Я читаю «Язык программирования 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 в этом случае?

1 Ответ

1 голос
/ 16 мая 2019

Нельзя преобразовать указатель массива void* lineptr[] в void**, они не являются совместимыми типами. Но qsort ожидает указатель void* на первый элемент, так что это не правильно, не важно.

Учитывая char *lineptr[100];, затем в C просто передайте lineptr в qsort как есть, без приведения.

Внутри обратного вызова каждый void* будет фактически указывать на адрес char*, поэтому вам, возможно, придется сделать что-то странное, похожее на char* ptr = *(char**)param;.

В C ++ вместо этого следует использовать std::sort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...