对 Qsort 和指针感到困惑

2024-05-04

我是一名 C 初学者程序员,想要习惯术语和指针。 我在寻找对数值数组元素进行排序的方法时发现了以下工作函数原型。该函数是 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 casts a指向一个指针int然后取消引用它,这样你就得到了存储在的整数a。请注意,这不会改变a或值a指着。
  3. 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(使用前将#替换为@)

对 Qsort 和指针感到困惑 的相关文章

随机推荐

  • 使用主题函数在 body 标记后插入代码

    我试图在开头添加一段代码everyDrupal 站点中的页面 因为我有不止一个page模板 我想以编程方式执行此操作 但没有成功 我还是个新手 虽然我了解了钩子 主题函数等的要点 但我只是想不出实现这一目标的正确方法 到目前为止我已经覆盖了
  • R data.frame 从另一个变量选择的变量中获取值,向量化

    我收到的数据包含许多类似的变量 还有一个附加变量指示哪些变量one我真正想要的那些类似的变量 使用循环我可以查找正确的值 但是数据很大 循环很慢 而且看起来这应该是可矢量化的 我只是还没弄清楚怎么做 编辑 所选变量将用作同一数据框中的新变量
  • SwiftUI - 正确使用 @available() 和 #available

    我在下面的代码中遗漏了什么吗 此应用程序在 iOS 15 设备上构建 macOS Monterey b5 Xcode 13 b5 并完美执行 但在 iOS 14 7 设备上导致 SIGABRT import SwiftUI struct C
  • 在 RecyclerView 中回收视图后,长按会损坏 EditText(或 android.support.v7.widget.AppCompatEditText)

    Bug总结 After EditText正在被回收RecyclerView 其用于选择所有文本并显示上下文菜单 剪切 复制 粘贴 的长按行为不再按预期工作 从 Android 15 到 Android 28 都会出现此问题 我都尝试过Edi
  • 角度抛出错误 $parse:ueoe 表达式意外结束

    我网站的这一部分有错误 我无法弄清楚 因为我几个月没有更改它 错误是 Error parse ueoe http errors angularjs org 1 4 3 parse ueoe p0 event id 3FEventContro
  • 如何使用 JGit API 从父提交获取树?

    对于给定的提交 我想获取父提交树 以便我可以继续比较更改 我发现父 RevCommit 对象上的 getTree 始终返回 null ObjectId lastCommitId repository resolve Constants HE
  • 查找二维空间中圆内的所有点

    我表示我的 2D 空间 考虑一个窗口 其中每个像素显示为 2D 数组中的一个单元格 即 100x100 的窗口由相同维度的数组表示 现在给定窗口中的一个点 如果我画一个半径的圆r 我想找到该圆圈中的所有点 我想我应该检查半径周围方形区域中的
  • request.getScheme() 返回 http 而不是在 java 中返回 https

    function demo request response request getScheme is returning http instead of returning https System out println request
  • JavaScript blob 编码为 UTF-8 而不是 ANSI

    我使用 JavaScript blob 创建一个 FDF 文件 该文件打开并填充本地存储的 PDF 但是 本地存储的 PDF 的文件路径包含重音字符 并且我无法编辑文件夹名称 当文件夹路径不包含重音符号时 此代码有效 并且如果我在记事本中打
  • 在生产 Web 服务器上安装 Visual Studio 的原因

    有人将 Visual Studio 安装在 Web 服务器上 其唯一目的是为传入请求提供服务 是否有正当理由 说真的 有人可能这样做有什么特殊原因吗 一种可能的用途是连接到 Web 服务器并调试某种错误或内存泄漏 这些错误或内存泄漏已被证明
  • Android:图库视图已被弃用?

    我一直在使用图库控件来显示照片 但在滑动照片时遇到问题 我需要一直滑动才能更改照片 否则它会弹回到上一张照片 上网一查 听说画廊已经被废弃了 下一个可以与画廊控件执行相同操作的控件是什么 Use a Gridview http develo
  • Groovy 中的嵌套“each”循环

    需要有关 groovy 中嵌套循环语法的指导 如何使用迭代器在这里打印 a name的值 b name的值 的值 List a a each print it name List b something b each print value
  • 用以前的非缺失值填充“缺失”值的有效方法是什么?

    我有一个向量 using Missings v allowmissing rand 100 v rand 100 lt 0 1 missing 最好的填充方式是什么v与最后一个非缺失值 现在 for i val in enumerate v
  • pandas:qcut错误:ValueError:Bin边缘必须是唯一的:

    我正在尝试使用 pandas qcut 方法计算两列的百分位数 如下所示 my df float col quantile pd qcut my df float col 100 labels False my df int col qua
  • Visual Studio 项目的依赖关系图

    我目前正在将一个大型解决方案 约 70 个项目 从 VS 2005 NET 2 0 迁移到 VS 2008 NET 3 5 目前我有 VS 2008 NET 2 0 问题是我需要将项目一一移动到新的 NET 框架 确保没有 NET 2 0
  • 在 iOS 9 上,所有 uitableviewcell 的高度都变成一行

    我有一个带有多个 UITableView 控制器的应用程序 在 iOS 8 x 上运行 每个表格中所有单元格的高度将调整大小以适合单元格的内容 所有单元格仅包含纯文本的 UILabel 现在 在 iOS 9 上运行时 每个表格上的每个单元格
  • Java - 线程“主”中的异常 java.util.ConcurrentModificationException

    有什么办法可以修改HashMap迭代特定键时的值 下面给出一个示例程序 public static void main String args HashMap
  • javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication

    我开发了一个 Spring boot 应用程序 该应用程序的功能运行良好 但是 在启动时 我多次看到以下异常 当我几周前运行相同的应用程序时 我没有看到任何此类异常 此后代码库没有改变 我想知道它是否与环境有关 我发帖的原因是我想更多地了解
  • 能够删除特定约束的增量 SMT 求解器

    是否有增量 SMT 求解器或用于某些增量 SMT 求解器的 API 我可以在其中增量添加约束 在其中我可以通过某个标签 名称唯一地标识每个约束 我想唯一地标识约束的原因是这样我可以稍后通过指定标签 名称来删除它们 需要放弃约束是因为我之前的
  • 对 Qsort 和指针感到困惑

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