我是一名 C 初学者程序员,想要习惯术语和指针。
我在寻找对数值数组元素进行排序的方法时发现了以下工作函数原型。该函数是 qsort,它使用指针。现在我的理解是,“const”一词确保值 a 和 b 不变,但指针不变。如果我在这里错了,请纠正我。我的问题是:
- 我们为什么使用
void *
我们不能使用该功能吗int *
来自
开始?
- 施工如何进行
*(int*)a
在返回部分
工作?
-
为什么 qsort 算法需要这么多参数?
int compare (const void *a, const void *b)
{
return ( *(int*)a - *(int*)b );
}
非常感谢您的回答。
PS:这对我来说是一项相当复杂的任务。
-
qsort
这样做是为了它可以用作通用分类器。如果它会使用int
从一开始它就只能用于比较整数。例如,您还可以通过这种方式对字符串进行排序strcmp
作为比较函数qsort
.
-
*(int*)a
casts a
指向一个指针int
然后取消引用它,这样你就得到了存储在的整数a
。请注意,这不会改变a
或值a
指着。
-
qsort http://linux.die.net/man/3/qsort需要 4 个参数:要排序的数组、该数组中的元素数量和元素的大小,最后是比较函数。它需要所有这些信息,因为它再次被设计得尽可能通用。
它需要元素的数量,因为在 C 中指针不携带有关它们后面的缓冲区大小的信息。它需要知道每个元素的大小,以便可以正确地将元素传递给比较函数。例如,要比较int
你会通过的sizeof(int)
作为尺寸参数。要比较字符串,您可以使用sizeof(char *)
.
ADDIT正如 H2CO3 所建议的使用原因const void *
是表明比较函数不能改变指向的值a
and 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;
}
根据您对演员阵容的喜好。 (我更喜欢避开它们)
最后,澄清一下星号:
*(int *)a
^ ^
| └ cast to integer pointer
└ dereference (integer) pointer
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)