菜鸟的有关问题,请大家解答。多谢

初学者的问题,请大家解答。谢谢!初学者,char*lineptr[5000]voidqsort(void*lineptr[],intleft,intright,in

初学者的问题,请大家解答。谢谢!
初学者,
char   *lineptr[5000];
void   qsort(void   *lineptr[],   int   left,   int   right,   int   (*comp)   (void   *,   void   *))
void   numcmp(char   *,   char   *);

qsort((void   **)lineptr,   0,   50,   (int   (*)(void   *,   void   *))   (numeric   ?   numcmp   :   strcmp));

请问以上int   (*comp)   (void   *,   void   *)是什么意思啊?
在调用qsort时,(void   **)lineptr是什么意思?(int   (*)(void   *,   void   *))   (numeric   ?   numcmp   :   strcmp)也是看不明白?
请大家说说,谢谢!


[解决办法]
(*comp) (void *, void *)这个是一个函数指针,指向一个函数体。
(void **)lineptr 是二维指针,相当于一维指针数组,也就是一个数组,它里面存的全是指针。
(int (*)(void *, void *)) (numeric ? numcmp : strcmp)
逗号表达式,(void *, void *) 取后面的void *,强制转化为整型,判断是否为数字,如果是调用函数 numcmp(),如果不是数字就调用字符串比较函数!


[解决办法]
qsort排序,就需要比较大小,但数据指针是 void *lineptr[]
显然不能比较真正数据的大小,
comp就是让你给qsort提供一个比较大小的函数
[解决办法]
举例:
整数排序
int comp_int(void* pX,void* pY) // 不用int,是因为qsort规定要用void*
{
if((pX == 0) || (pY == 0)) return 0;

// 强制转换,因为我们知道这个数据实际是int*
int* pA = (int*)pX;
int* pB = (int*)pY;

// 返回 <0表示小于, 返回0表示等于, 返回> 0表示大于
return *pA - *pB; // 如果要倒序排列,用 return *pB - *pA;
}

// 使用
int data[5] = {1,9,4,3,7};
qsort(data, // 数据
   5, // 5个数据
sizeof(int), // 每个数据字节数是sizeof(int)
comp_int); // 比较大小用comp_int函数