为什么原因导致无效**?

时间:2012-10-27 20:57:32

标签: c pointers casting

这是“The C programming language”一书中的C代码:

#include <stdio.h>
#include <string.h> 

#define MAXLINES 5000    /* max #lines to be sorted */
char *lineptr[MAXLINES]; /* pointers to text lines */

int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);

void qsort(void *lineptr[], int left, int right, 
        int (*comp)(void *, void *));

int numcmp(char *, char *);

/* sort input lines */
main(int argc, char *argv[])
{
    int nlines;

    int numeric = 0; /* number of input lines read */

    if (argc > 1 && strcmp(argv[1], "-n") == 0)  /* 1 if numeric sort */
        numeric = 1;
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
        qsort((void**) lineptr, 0, nlines-1, // MY QUESTION: WHY lineptr IS CAST TO POINTER TO A VOID POINTER
                (int (*)(void*,void*))(numeric ? numcmp : strcmp));
        writelines(lineptr, nlines);
        return 0;
    } else {
        printf("input too big to sort\n");
        return 1;
    }
}


void qsort(void *v[], int left, int right,
        int (*comp)(void *, void *))
{
    int i, last;
    void swap(void *v[], int, int);
    // rest of code
}

为什么在调用qsort函数时,第一个参数被强制转换为指向void指针(void **)而不仅仅是指向void(void *)的指针。请告诉我为什么会这样?

由于

2 个答案:

答案 0 :(得分:1)

编译器会警告你这些天,除非你将无效指针转换为void指针,当你将它们作为void指针传递时(如果这有意义)。我想你知道的。

void **lineptr的签名在C到void *lineptr[]中是等价的,qsort是{{1}}作为参数的指针类型。有关详细信息,请参阅this网站。

答案 1 :(得分:0)

这里,qsort函数定义int (*comp)(void *, void *)参数,*comp是一个函数指针,可用于调用比较函数。即使他们没有相同的功能名称(compnumcmp),它仍然有效。