2016-02-23 3 views
-2

Pg 119 К & R показывает QSort написаны с указателями на функции:Указатель на код функции от K & R

if ((nlines = readlines(lineptr, MAXLINES)) >= 0) 
    qsort((void **) lineptr, 0, nlines -1, 
     (int (*)(void *, void *))(numeric ? numcmp : strcmp)); 

В этом коде lineptr отливается как указатель на указатель к мочеиспусканию. Это указатель на массив указателей на символы. Однако код можно также написать так:

qsort((void *) lineptr, 0, nlines-1, 

и все еще работает отлично. Компилятор просто это выясняет? Зачем писать код так или иначе?

+3

'qsort()' ожидает, что первым параметром будет '(void *)'. Я предполагаю, что компилятор называет '(void **)' back to '(void *)' неявно. –

+1

Вы также используете объявление 'qsort' с этой страницы? –

+0

Да, я использую объявление из pg 119 –

ответ

1

В этом объявлении первый аргумент имеет тип void* lineptr[], что эквивалентно void** lineptr.

Если вы вызываете с помощью

qsort((void *) lineptr, 0, nlines-1); 

он все еще работает, потому что вы можете преобразовать void* любой другой тип указателя на C. лучше использовать точно соответствующий тип, но это больше руководства кодирования, чем требование по языку.

Возможно, поскольку я не уверен, что когда книга была написана, неявное преобразование от void* к void** не было поддержано компиляторами. Следовательно, книга использует (void**)lineptr в качестве первого аргумента.

+0

Это имеет смысл. Благодаря! –

Смежные вопросы