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

时间:2014-10-23 08:52:58

标签: 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 <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来获取值

看一下这个例子,类型转换看起来很奇怪。

请您帮助我了解每件作品的意义,以达到最终价值?

感谢。

1 个答案:

答案 0 :(得分:2)

此:

char s1 = *(*(char * const *)p1);

有两件事:

  • 取消引用(char * const *) p1,即将p1转换为指向字符指针的指针(让我们忽略const,并取消引用。这会产生一个字符指针。
  • 取消引用该字符指针,产生一个字符。

s2的代码当然是相同的,但适用于p2

qsort()库函数会调用cmp()p1p2指向argv,这不是&#34; 2D字符数组&# 34;它是一维字符指针数组。所以qsort()将使用指向这些指针的指针调用cmp(),因为它是正在排序的指针。

然后(危险地)通过从彼此中减去这些第一个字符来完成排序。那部分,回归,写得更好:

return s1 < s2 ? -1 : s1 > s2;

发布时,代码有整数下溢问题。