指向常数的“万能”指针:const void*在qsort的应用

2023-05-16

qsort函数

函数的原型:
void qsort(void*base,size_t num,int(*comparator)(const void *,const void *));
参数解释:
很简单理解,第一个参数就是待排序的起始地址、元素个数和每个元素大小
最后那个参数比较特别,是一个指向函数的指针,该函数大概的形式为:
int cmp(const void *,const void *){…}
而const void *被称为指向常数的“万能”指针,它可以通过强制转换变成任意类型的指针
举个小栗子:

#include<stdio.h>

int cmp(const void*a,const void *b) {
	return *(int*)a - *(int*)b;
}
int main() {
	int a = 1, b = 10;
	int c = 0;
	c = cmp(&a,&b);
	printf("%d",c);
	return 0;
}

运行结果:
在这里插入图片描述
换成 char 类型:

#include<stdio.h>

int cmp(const void*a,const void *b) {
	return *(int*)a - *(int*)b;
}
int main() {
	char a = 'a';
	char b = 'f';
	int c = 0;
	c = cmp(&a,&b);
	printf("%d",c);
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

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

指向常数的“万能”指针:const void*在qsort的应用 的相关文章

  • c++之const指针

    我们知道 const可以修饰一般的变量 这样的变量我们称之为常变量 常变量的值是不能修改的 const也可以修饰指针变量 可以指定指针变量是一个常量 或者指定指针变量指向的对象是一个常量 有以下几种情况 一 指向常量的指针变量 const
  • 对extern,static,const的再认识

    const const修饰的值为常量 是不可改变的 在c 语言中是不可改变的 而在C语言中 我们可以通过指针去修改那一片地址的值 const修饰的指针 表面指针指向或者指针的值是不可被修改的 我们可以通过通配符 的位置来判断 在左说明修饰的
  • 【转】C++类(Class)总结,经典易懂

    C 类 Class 总结 一 C 类的定义 C 中使用关键字 class 来定义类 其基本形式如下 class 类名 public 行为或属性 protected 行为或属性 private 行为或属性 示例 定义一个点 Point 类 具
  • const 在C和C++ 中的区别

    目录 c中的const C 中的const const修饰指针 const修饰引用 const是construct的缩写 是c c 语言中的类型限定符 采用const修饰变量 功能是对变量声明为只读特性 并保护变量值以防被修改 c中的con
  • 在 C 中使用 qsort 对字符数组进行排序

    我正在尝试使用qsort对字符数组进行排序 我不明白为什么这不起作用 我有一个指向比较函数的指针man页指定 有人可以告诉我出了什么问题吗 谢谢 我的代码 include
  • 如何在 C 中对指向 char 的指针数组进行 qsort?

    假设我有一个指向 C 中 char 的指针数组 char data 5 boda cydo washington dc obama 我希望使用 qsort 对该数组进行排序 qsort data 5 sizeof char compare
  • 异步任务与异步无效

    这可能是一个非常愚蠢的问题 但我有以下几行代码将 RAW 图像转换为 BitmapImages public async void CreateImageThumbnails string imagePath int imgId await
  • C# 中的 void** 是什么?

    我正在查看一个使用 C 编写的库的 C 程序的源代码 我遇到了这一行 但不确定它是什么 cvbimUNSAFE GetImageVPA cvbim IMG cvImg Image 0 void lpImageBits pVPAT 什么是类型
  • C++ 向函数发送任何类型的参数

    事情是这样的 我想创建一个 void 函数 它将接收两种众所周知的值类型和另一种可以是任何类型的值 代码如下 void change settings string element short setting value switch se
  • 关于C中的qsort(),** buf和buf[][]的区别

    当我在 Mac 上的 C 语言中使用 qsort 时 这些代码运行良好 它可以很好地对一个文件中的每一行进行排序 int compare const void p const void q return strcmp p q void fu
  • 解释 qsort 库中使用的函数的 typedef

    我正在使用 qsort 库函数对结构元素数组进行排序 在互联网上搜索时我发现了一个资源 信息 使用 C qsort 函数对结构进行排序 support microsoft 我知道 qsort 函数需要通过通用指针进行类型转换 但是我无法得到
  • C# 中的“公共无效”函数

    谁能告诉我为什么当我尝试声明和使用 public void 函数时它会给我错误 Expected class delegate enum interface or struct 我在开始时声明了它并正确设置了它 并且它不会调用我的主体 我已
  • 为什么不完整的类型不能转换为 void?

    为什么下面的代码会出现以下错误 为什么类型需要完整才能转换为void struct Incomplete class Class virtual void foo Incomplete incomplete void incomplete
  • qsort 给出 [错误]:从 `int (*)(cricketer*, cricketer*)' 到 `int (*)(const void*, const void*)' 的无效转换

    这是代码 它按平均跑数对板球运动员的数据进行排序 这qsort函数显示错误 错误 C Users Encoder Documents C Free Temp Untitled3 cpp 29 错误 无效的转换int cricketer cr
  • 为什么将“extern puts”转换为函数指针“(void(*)(char*))&puts”?

    我正在看例子abo3 c http community corest com gera InsecureProgramming abo3 html from 不安全编程 http community corest com gera Inse
  • 强制转换为“void”到底有什么作用? [复制]

    这个问题在这里已经有答案了 经常使用的语句 例如 void x 允许抑制有关未使用变量的警告x 但是如果我尝试编译以下内容 我会得到一些我不太理解的结果 int main int x short x void x int x 用 g 编译它
  • 递归 C void 函数和 return 关键字

    有人知道以下之间的内部区别 void RecFoo1 int bar if bar 0 return RecFoo1 bar 1 and void RecFoo2 int bar if bar 0 return return RecFoo2
  • 单元测试 - 如何测试仅插入日志消息的“void”方法(Serilog)

    我需要测试类型的方法void 它只是使用 LOG 框架在我的 LOG 变量上插入一条消息 Serilog https serilog net 参见实现示例 public class MyClass public MyClass ILogge
  • TypeScript 中未检查“void”返回类型 – 防止浮动承诺?

    在 TypeScript 3 9 7 中运行 这与编译器无关 const someFn gt void gt 123 我发现这个答案 https stackoverflow com a 12763878 2072165 这说明这是设计使然
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68

随机推荐