- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 C 语言的初级程序员,想要习惯术语和指针。在寻找对数值数组元素进行排序的方法时,我发现了以下工作函数原型(prototype)。该函数是 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
Actor a
指向指向- int
的指针然后取消引用它,所以你得到存储在 a
的整数.请注意,这不会改变 a
或 a
的值指向。 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/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!