C stdlib qsort比较函数中的类型转换
此代码段主要来自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 <
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;