【问题标题】:type conversion in comparison function of stdlib qsortstdlib qsort 比较函数中的类型转换
【发布时间】:2014-10-23 08:52:58
【问题描述】:

这段代码sn-p主要来自qsort的man page。

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 中的 &argv[1] 字符数组 但是,我很困惑为什么我必须进行以下演员才能获得价值?

*(*(char * const *)p1)

我还检查了stackoverflow中的其他问题,当我们传递一维数组时很容易。 所以,我可以使用

type var = *(const type *)p1 获取值

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

请你帮我理解每一个铸件的意义,以达到最终的价值?

谢谢。

【问题讨论】:

  • sn-p 只比较字符串的第一个字符,这是你想要的吗?片段确实包含*(type *)p1,其中typeconst char*
  • 我要解析的是来自命令行参数的数组。

标签: c string pointers qsort


【解决方案1】:

这个:

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

做两件事:

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

s2 的代码当然是一样的,但是p2 的代码。

qsort() 库函数将调用cmp()p1p2 指向argv,这不是“二维字符数组”,而是字符指针的一维数组。所以qsort() 将调用cmp() 并使用指向这些指针的指针,因为正在排序的是指针。

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

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

正如发布的代码有整数下溢问题。

【讨论】:

  • 嗨,放松一下。感谢您的回答。我修改了二维数组的错误措辞。我的意思是指向 char 数组的指针的地址。所以,它需要两颗星来处理它。然后它需要在取消引用单个字符之前将 void *p1 转换为原始类型的指针。我的理解正确吗?提前感谢您的帮助。
猜你喜欢
  • 2010-09-24
  • 2014-10-10
  • 2021-05-29
  • 1970-01-01
  • 2018-03-26
  • 2021-08-04
  • 2018-09-14
  • 1970-01-01
相关资源
最近更新 更多