C 投空**,原因是什么?

C 投空**,原因是什么?,c,pointers,casting,C,Pointers,Casting,以下是《C编程语言》一书中的C代码: #包括 #包括 #定义要排序的最大行数5000/*最大行数*/ char*lineptr[MAXLINES];/*指向文本行的指针*/ int readlines(char*lineptr[],int nlines); 无效写入线(字符*lineptr[],整数行); void qsort(void*lineptr[],左整数,右整数, 内部(*comp)(无效*,无效*); int numcp(char*,char*); /*对输入行排序*/ main(i

以下是《C编程语言》一书中的C代码:

#包括
#包括
#定义要排序的最大行数5000/*最大行数*/
char*lineptr[MAXLINES];/*指向文本行的指针*/
int readlines(char*lineptr[],int nlines);
无效写入线(字符*lineptr[],整数行);
void qsort(void*lineptr[],左整数,右整数,
内部(*comp)(无效*,无效*);
int numcp(char*,char*);
/*对输入行排序*/
main(int argc,char*argv[])
{
国际在线;
int numeric=0;/*读取的输入行数*/
if(argc>1&&strcmp(argv[1],“-n”)==0)/*1 if数字排序*/
数值=1;
如果((nlines=readlines(lineptr,MAXLINES))>=0){
qsort((void**)lineptr,0,nlines-1,//我的问题:为什么将lineptr转换为指向void指针的指针
(int(*)(void*,void*)(数字?numcmp:strcmp));
写入线(行PTR、行nlines);
返回0;
}否则{
printf(“输入太大,无法排序\n”);
返回1;
}
}
void qsort(void*v[],左整数,右整数,
内部(*comp)(无效*,无效*)
{
int i,最后;
无效交换(无效*v[],整数,整数);
//代码的其余部分
}
为什么在调用qsort函数时,第一个参数被转换为指向void指针(void**)的指针,而不仅仅是指向void(void*)的指针。请告诉我为什么会这样


谢谢,除非您在将非void指针作为void指针传递时将其转换为void指针(如果有意义的话),否则编译器现在会警告您。不过,我想你知道这一点


void**lineptr
的签名在C中等同于
void*lineptr[]
,这是
qsort
作为参数的指针类型。有关更多详细信息,请参见网站。

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

这是参数
qsort
所期望的类型。当您传递
lineptr
时,这将成为
char**
,编译器应该会抱怨。将指针转换为预期类型会关闭编译器,因为它会显示“我知道我在做什么”,并将参数转换为正确的类型。您好,谢谢!一开始我没有看到等价性。我现在看得很清楚。Hey@XB.Wang请避免在旧帖子上给出答案,在新帖子上给出答案。。
#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
}