解释一下c中qsort()函数的类型转换? [关闭]

2024-03-24

1)在这段代码中pLhs and pRhs指向某个随机内存位置,那么如何将该随机内存位置的内容复制到 LHS 指向的位置?

2)解释使用的比较器函数qsort() in C??

int comparator(const void *pLhs, const void *pRhs)
{

    int *lhs = (int *)pLhs;

    int *rhs = (int *)pRhs;
 

    return *lhs > *rhs;
}

这段代码是由这个子集和的程序组成的


qsort被编写为可以对任何类型的数据进行排序。大部分排序都是在内存中移动项目,这可以通过移动表示数据的字节来完成:您不需要知道两个数组元素中字节的含义来交换它们,您只需要知道在哪里它们是什么以及每个字节有多少字节。所以qsort可以接受一个void *该部分位于数组的开头和一个size_t它告诉它每个元素中有多少字节,并且它不关心该元素的原始类型是什么void * is.

然而,qsort无法仅根据字节来确定排序顺序中两个元素中哪一个更早。它可以纯粹按照字节中位的二进制值对所有数组元素进行排序,但有人可能希望以相反的顺序对数组进行排序,或者按字母顺序对字符串进行排序,忽略大小写,或者按浮点解释进行排序。其中每一个的排序都与仅按二进制值排序不同。所以qsort需要一个辅助例程。这是传递给它的比较例程。

Since qsort只给出一个void *,它不知道数组元素的原始类型是什么,因此无法将该类型传递给比较例程。比较例程必须将void *到正确的类型。每个比较例程都是根据其比较元素的类型进行定制的。它传递的指针不指向随机地址;它们指向正在排序的数组中的元素。

给定函数声明int comparator(const void *pLhs, const void *pRhs), 分配int *lhs = (int *) pLhs;转换为void *范围pLhs to an int *多变的lhs. Then *lhs可以用作int,所以可以rhs.

您显示的示例代码中存在三个错误或缺陷。首先,比较例程传递一个const void *。预计不会更改所指向的值。所以它应该将指针转换为const int *, not int *.

其次,在 C 中强制转换是不必要的。简单地做const int *lhs = pLhs;将工作。编译器会自动转换const void * to const int *初始化时lhs。 (在 C++ 中,这样的强制转换可能是必要的。)在 C 中,在不必要的情况下不鼓励进行此类强制转换,因为在某些情况下,如果强制转换不存在,它们可以通过逃避编译器将生成的警告消息来隐藏错误。事实上,这已经发生在这里。通过强制转换,Apple Clang 11 不会发出初始化警告。如果没有强制转换,编译器会警告初始化会丢弃const预选赛。

Third, return *lhs > *rhs;是不够的。这qsort如果左参数应排序在右参数之前,则比较应返回负值;如果它们就排序顺序而言相同,则比较应返回零;如果左参数应排序在右参数之后,则比较应返回正值。因此升序的正确代码可能是:

return *lhs < *rhs ? -1 : *lhs == *rhs ? 0 : +1;

对于降序排列,它可以是:

return *lhs > *rhs ? -1 : *lhs == *rhs ? 0 : +1;

如果您还不熟悉条件运算符,您可以使用:

if (*lhs > *rhs)
    return -1;
else if (*lhs == *rhs)
    return  0;
else
    return +1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释一下c中qsort()函数的类型转换? [关闭] 的相关文章

随机推荐

  • VueJS CKeditor5上传图片

    在 Vuejs 中使用 CKeditor5 上传图像时遇到问题 第一次尝试过简单上传适配器 https ckeditor com docs ckeditor5 latest features image upload simple uplo
  • Fluent NHibernate 主键约束命名约定

    有没有办法在 Fluent NHibernate 中为我的主键约束创建命名约定 我知道您可以命名外键约束 但似乎不可能命名主键约束 FNH 的 James Gregory 说 不 NHibernate 不支持这一点 因此我们也无法支持它 h
  • 有没有办法将自定义颜色存储在文件中并从 iOS 中的代码访问它们?

    我是一个 iOS 新手 但我有一些 Android 编程经验 我记得在 Android 中你可以在一个文件中定义一组自定义颜色颜色 xml您可以在代码中使用该文件 因此 每次必须在某处应用新颜色时 无需以编程方式定义新颜色 我的问题是 iO
  • 如何序列化List

    我有A班 B班和C班是A班的一部分 Class A Few Properties of Class A List
  • OpenGL4.5 - 绑定多个纹理和采样器

    我试图了解 OpenGL 4 5 中的纹理 纹理单元和采样器 我附上一张我想弄清楚的图片 我认为在我的示例中一切都是正确的 但我不太确定右侧带有问号的 1D 采样器 所以 我知道 OpenGL 提供了许多纹理单元 绑定点 可以在其中绑定纹理
  • 模型驱动架构值得吗?工具的最新技术水平如何?

    我们的商店经常遇到一个问题 即同一类别 实体有 3 或 4 种不同的表示形式 java 版本 xml 版本 hibernate 版本 json 版本 您明白了 显然这会产生维护问题 模型驱动架构可能不止于此 但我真正想要的是一个系统 它允许
  • 如何让 Resharper 转换回 foreach 循环

    Resharper 5 可以转换我的foreach循环到 Linq 查询 我喜欢哪个 但是 linq 比foreachloop 当我转换我的foreach语句到 linq 查询 我没有看到任何以其他方式返回的选项 有谁知道如何做到这一点 有
  • 如何忽略目录中除一个文件之外的所有内容

    回购结构 gitignore file1 file2 dir file3
  • 召唤辅助以获得更高种类的类型,而不参考原始类型

    我正在尝试将 Aux 模式与更高种类的类型一起使用 并且直到之后才必须指定更高种类类型的参数 这类似于所描述的SO问题here https stackoverflow com questions 52581986 aux pattern f
  • 如何从不同(子)目录中打包 java 源文件?

    考虑以下目录结构 source com mypackage A java extensions extension1 source com mypackage T java extensions extension2 source com
  • ActiveRecord:find_in_batches 的替代方案?

    我有一个加载数千个对象的查询 我想通过使用来驯服它find in batches Car includes member where engine gt 123 find in batches batch size 500 根据文档 我不能
  • Babel + Mocha 堆栈跟踪报告错误的行号

    使用 Babel 6 和 Mocha 时 堆栈跟踪报告错误的行号 我很确定这是因为转译添加了额外的代码 对我来说 这是 Babel 6 与 Babel 5 x 中的新行为 有人有关于如何在使用 Mocha 进行单元测试时解决此问题的解决方案
  • 向量化 R 的 dplyr 中每行的“日期范围的扩展”

    我在 R 中的 tibble 中有一个数据集 如下所示 A tibble 50 045 x 5 ref key start date end date
  • 如何使用 Robo 3T 从 MongoDB 导出 JSON

    我正在使用 Robo 3T 以前称为 RoboMongo 我将其连接到 MongoDB 我需要做的是 MongoDB 中有一个集合 我想从该集合中导出数据 以便将其保存到文件中 I used the interface to open th
  • 打印 rdlc 报告而不查看打印对话框

    我正在编写一个 POS 应用程序 需要经常打印发票 我需要将其直接发送到打印机 而不是查看打印对话框 使用 Reportviewer renderingcomplete 我可以避免看到报告 但我不知道如何避免看到打印对话框并在没有用户干预的
  • 如何在异步加载的 HTML 元素之间创建信号量

    我在 HTML 页面中有一个出现多次的元素 并且运行相同的 JS 问题是 我希望它只有在第一个运行它时才执行特定功能 他的兄弟姐妹从未运行过它 我需要信号量在它们之间同步 我无法知道如何在 JS 中声明变量并以这种方式执行信号量 有很多方法
  • Glassfish 中的 JNDI 配置/查找

    我在 Glassfish 中获取一些基本的 JNDI 配置时遇到问题 我认为应该是一个简单的任务 在运行时确定特定属性是否设置为 true 我认为这是 JNDI 的一个很好的应用程序 但似乎无法在应用程序服务器和我的 servlet 代码之
  • 为什么自定义的基于 nib 的表格单元格的 init 方法没有被调用

    我有一个在界面生成器中创建的基于笔尖的表格视图单元 我将表视图单元格的类设置为FooTableViewCell它延伸自UITableViewCell In FooTableViewCell我像这样重写 init 方法 id init if
  • UITableViewRowAction 标题图像

    我做了一个自定义的 UITableViewRowAction 现在我想添加图像而不是文本 我知道这是可能的 但不知道该怎么做 你们中有人知道如何在 Swift 中执行此操作并愿意帮助我吗 感谢您的回答 iOS 11 0 Swift Appl
  • 解释一下c中qsort()函数的类型转换? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 1 在这段代码中pLhs and pRhs指向某个随机内存位置 那么如何将该随机内存位置的内容复制到 LHS 指向的位置 2 解释使用的比较