gpt4 book ai didi

对 Qsort 和指针感到困惑

转载 作者:太空宇宙 更新时间:2023-11-04 06:00:48 25 4
gpt4 key购买 nike

我是 C 语言的初级程序员,想要习惯术语和指针。在寻找对数值数组元素进行排序的方法时,我发现了以下工作函数原型(prototype)。该函数是 qsort,它使用指针。现在我的理解是,“const”一词确保值 a 和 b 不变,但指针不变。如果我在这里错了,请纠正我。我的问题是:

  1. 为什么我们使用void *函数我们可以不使用int *吗开始?
  2. 返回部分如何构造*(int*)a工作?
  3. 为什么 qsort 算法需要这么多参数?

    int compare (const void *a, const void *b)
    {
    return ( *(int*)a - *(int*)b );
    }

非常感谢您的回答。PS:这对我来说是一项相当复杂的任务。

最佳答案

  1. qsort以这种方式制作,因此它可以用作通用分拣机。如果它会使用 int从一开始它只能用于比较整数。例如,您还可以通过传递 strcmp 对字符串进行排序作为 qsort 的比较函数.
  2. *(int*)a Actor a指向指向- int 的指针然后取消引用它,所以你得到存储在 a 的整数.请注意,这不会改变 aa 的值指向。
  3. qsort 需要 4 个参数:要排序的数组、该数组中元素的数量和元素的大小,最后是比较函数。它需要所有这些信息,因为它被设计得尽可能通用。

    它需要元素的数量,因为在 C 中,指针不携带有关其后缓冲区大小的信息。它需要知道每个元素的大小,这样它才能正确地将元素传递给比较函数。例如,比较 int你会通过 sizeof(int)作为尺寸参数。要比较字符串,您可以使用 sizeof(char *) .

ADDIT 根据 H2CO3 的建议使用 const void * 的原因表示比较函数可能不会改变a指向的值和 b .当然,这是为了确保对数组进行排序不会突然改变数组中的值。而且,正如 H2CO3 所说,转换到 (const int *) 会更干净这样您就不会在转换后意外更改值:

return *(const int *)a - *(const int *)b;

您还可以通过以下方式摆脱强制转换:

int compare(const void * a, const void * b){
const int * ia = a;
const int * ib = b;

return *ia - *ib;
}

取决于您对 Actor 阵容的喜好。 (我宁愿避开它们)

最后,澄清星号:

*(int *)a
^ ^
| └ cast to integer pointer
└ dereference (integer) pointer

关于对 Qsort 和指针感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19670320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com