C stdlib qsort比较函数中的类型转换

C stdlib qsort比较函数中的类型转换,c,string,pointers,qsort,C,String,Pointers,Qsort,此代码段主要来自qsort的手册页 int cmp(const void *p1, const void *p2) { char s1 = *(*(char * const *)p1); char s2 = *(*(char * const *)p2); return s1 - s2; } int main(int argc, char *argv[]) { int j; printf("Before Qsort: \n"); for(j = 1; j <

此代码段主要来自qsort的手册页

int cmp(const void *p1, const void *p2)
{
   char s1 = *(*(char * const *)p1);
   char s2 = *(*(char * const *)p2);
   return s1 - s2;
}

int main(int argc, char *argv[])
{
  int j; 
  printf("Before Qsort: \n");
  for(j = 1; j <argc ; j++)
    printf("%s ", argv[j]);
  printf("\n");
  qsort(&argv[1], argc - 1, sizeof(char *), cmp);
  printf("After Qsort: \n");
  for(j = 1; j <argc ; j++)
    printf("%s ", argv[j]);
  printf("\n");
}
int-cmp(常数无效*p1,常数无效*p2)
{
字符s1=*(*(字符*常量*)p1);
字符s2=*(*(字符*常量*)p2);
返回s1-s2;
}
int main(int argc,char*argv[])
{
int j;
printf(“在Qsort之前:\n”);
对于(j=1;j

做两件事:

  • 取消引用
    (char*const*)p1
    ,即将
    p1
    转换为指向字符指针的指针(让我们忽略
    const
    ,并取消引用该指针。这将生成字符指针
  • 取消引用该字符指针,生成单个字符
s2
的代码当然是相同的,但是
p2
的代码是相同的

qsort()
库函数将调用
cmp()
,其中
p1
p2
指向
argv
,它不是“2D字符数组”,而是字符指针的1D数组。因此
qsort()
将调用
cmp()
指针指向这些指针,因为正在排序的是指针

然后(危险地)通过相互减去前几个字符来完成排序。返回部分写得更好:

return s1 < s2 ? -1 : s1 > s2;
返回s1s2;

如前所述,代码存在整数下溢问题。

代码段仅比较字符串的前几个字符,这是您想要的吗?snipet确实有
*(type*)p1
在其中,type
const char*
。我要分析的是来自命令行参数的数组。嗨,放松。谢谢你的回答。我修改了2D数组的错误措辞。我想要的是指向char数组的指针的地址。因此,它需要两颗星来处理它。然后它需要抛出void*在取消引用单个字符之前,将p1转换为原始指针类型。我的理解正确吗?提前感谢您的帮助。
return s1 < s2 ? -1 : s1 > s2;