此代码段主要来自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");
}
我可以理解我将指针的地址传递给qsort中的&amp; argv [1]的char数组 但是,我很困惑为什么我必须进行以下演员才能获得价值?
*(*(char * const *)p1)
我还检查了stackoverflow中的其他问题,当我们传递1-D数组时很容易。 所以,我可以使用
输入var = *(const type *)p1来获取值
看一下这个例子,类型转换看起来很奇怪。
请您帮助我了解每件作品的意义,以达到最终价值?
感谢。
答案 0 :(得分:2)
此:
char s1 = *(*(char * const *)p1);
有两件事:
(char * const *) p1
,即将p1
转换为指向字符指针的指针(让我们忽略const
,并取消引用。这会产生一个字符指针。 s2
的代码当然是相同的,但适用于p2
。
qsort()
库函数会调用cmp()
,p1
和p2
指向argv
,这不是&#34; 2D字符数组&# 34;它是一维字符指针数组。所以qsort()
将使用指向这些指针的指针调用cmp()
,因为它是正在排序的指针。
然后(危险地)通过从彼此中减去这些第一个字符来完成排序。那部分,回归,写得更好:
return s1 < s2 ? -1 : s1 > s2;
发布时,代码有整数下溢问题。