【C】回调函数和qsort详解

这篇具有很好参考价值的文章主要介绍了【C】回调函数和qsort详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回调函数概念

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一
个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该
函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或
条件进行响应。
简单的来说,回调函数就是通过函数指针调用的函数就是回调函数。我们库里面有一个函数qsort,就用到了回调函数。

库函数qsort(在头文件stdlib.h中)

这个函数是一个排序函数,我们学过冒泡排序,但是那个排序能够排序整型,我们今天说的qsort可以排序任何类型,它默认排的是升序。我们来看一下他的参数列表:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

这里的void* 为无类型,因为可以排序任意类型的数组,所以不知道你的是哪种数组的指针用void* 来接收,size_t为无符号整型,num表示的是数组的大小,width为数组中每个元素多大,最后一个参数就是函数指针了,指向的是 int xxxx(const void *elem1, const void *elem2 ) 这样一个函数。再看下图:
【C】回调函数和qsort详解,c语言,java,算法,开发语言
如果elem1指向的内容大于elem2指向的内容就返回大于0的数字,如果等于就返回0,如果小于就返回小于0的数字。
那么接下来我们就上手来用下这个函数:

// qsort需要的函数
int sort_int(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}
// 打印函数
void print(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 5,6,4,8,1,3,2,7,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
	qsort(arr, sz, sizeof(arr[0]), sort_int);
	print(arr, sz);
	return 0;
}

运行结果:

【C】回调函数和qsort详解,c语言,java,算法,开发语言
需要主要的是,void* 不能直接对它解引用操作,需要先强制类型转换,然后再操作。

qsort模拟实现

因为我们目前就学过冒泡排序,所以今天我们就用冒泡排序来模拟实现qsort.
我们将上面的代码拿下来,把qsort改为my_qsort.

int sort_int(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}
// 打印函数
void print(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 5,6,4,8,1,3,2,7,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
	my_qsort(arr, sz, sizeof(arr[0]), sort_int);
	print(arr, sz);
	return 0;
}

那现在我们只需要实现my_qsort就可以了,我们这里传递的是整型数组,所以可以用整型指针来接受,但是我们qsort是可以排序任何类型的数据的,所以我们要用void* 来接受。所以函数的参数列表为:

void my_qsort(void* arr, size_t num, size_t width, int (cmp)(const void, const void*))

我们冒泡排序不管排什么数据,排的趟数肯定不会变的,而且每一趟比较的对数也是固定的,所以我们可以把冒泡排序的大体框架实现出来,这里的函数指针指向的函数就可以认为比较两个元素的大小的函数。我们的比较函数需要两个指针,也就是两个元素的地址,这时候我们传过来的元素大小就起到作用了,我们首元素的地址可以认为就是arr,第二个就是arr+1width,又因为只有arr是(char)类型是,我们才能实现每次跳的单位是1,所以我们在这之前要将arr强制转化为(char*)类型因为我们拍的元素是变化的,我们这里将参数设置为
(char*)arr+j* width,(char*)arr+(j+1)*width,这样我们就可以实现my_sort了。

void my_qsort(void* arr, size_t num, size_t width, int (*cmp)(const void*, const void*))
{
	for (unsigned int i = 0; i < num - 1; i++)
	{
		for (unsigned int j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)(arr)+j*width,(char*)(arr)+(j+1)*width)>0)
			{
				Swap((char*)(arr) + j * width, (char*)(arr) + (j + 1) * width,width);
			}
		}
	}
}

这里就剩下一个Swap函数了,这个函数实现以后,我们的my_qsort就可以正常工作了。
因为我们还是要交换两个元素,所以我们要将两个元素的地址传过去,传过去的为(char*)类型的所以我们用char* 来接收就可以,又因为char*一次只能访问一个字节,如果我们要交换整型的话只需要将4个字节的内容都交换就可以了,所以我们还需要讲元素的大小过去。

void Swap(char* p1, char* p2, int width)
{
	char tmp = 0;
	for (int i = 0; i < width; i++)
	{
		tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}

到这里我们的qsort就实现完成了,我们来看一下运行结果:
【C】回调函数和qsort详解,c语言,java,算法,开发语言
我们可以看到我们的排序也没有问题。

今天的分享就到这里结束了,感谢大家的关注和支持!文章来源地址https://www.toymoban.com/news/detail-544575.html

到了这里,关于【C】回调函数和qsort详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言 快速排序——qsort函数详解

            我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序。         为了解决这些问题!就使用 qsort函数 吧! 目录 一、qsort函数使用方法 二、qsort函数使用示例      1.数组排序      2.字符数组排序  

    2024年02月03日
    浏览(51)
  • C语言——qsort函数的使用(详解)

    qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。 点击网站:https://cplusplus.com/reference/——再点击查看老版本函数超链接口(查看函数的含义) 老版本 在搜索框输入要查询的

    2024年02月14日
    浏览(52)
  • 【进阶C语言】qsort库函数(详解)

    qsort是C语言库函数里面的一种,包含于#include stdlib.h这个头文件里面,使用快速排序的方法 qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。 功能:对传入的任何数据进行排序,使其变成有序数列。 qsort是可以排序任意类型的数据

    2024年02月02日
    浏览(43)
  • 深入理解回调函数qsort:从入门到模拟实现

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言进阶之路 👉专栏推荐:✅C语言初阶之路 ✅数据结构探索 💻代码仓库:江池俊的代码仓库 ​🎪 社区:GeekHub社区 ​ 🎉欢迎大家点赞👍评论📝收藏⭐ 回调函数和 qsort 是 C语言编程中重要的概念,它们为我们提供了强大的工具

    2024年02月10日
    浏览(53)
  • 【C语言】qsort()函数详解:能给万物排序的神奇函数

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022   目录 一.qsort()函数的基本信息及功能 二.常见的排序算法及冒泡排序 三.逐一解读qsort()函数的参数及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(const void*,const void*) 四.使用qsort()函数完成整形,

    2024年02月06日
    浏览(48)
  • 【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        在这一篇博客中,我们要认识并理解 函数指

    2024年02月09日
    浏览(46)
  • 从排序算法的艺术看C语言qsort函数的魅力:一场数据的时空穿越

    欢迎来到白刘的领域    Miracle_86.-CSDN博客 系列专栏    C语言知识 先赞后看,已成习惯    创作不易,多多支持! 目录 一 、回调函数 二、qsort函数 1.qsort函数排序整型数据 2.qsort函数排序结构数据 何为回调函数?听起来很装逼的样子,实际上它是一个很简单的概念: 回调函

    2024年03月19日
    浏览(50)
  • c语言-qsort函数

    目录 一、函数介绍 二、qsort函数的使用 1、对int类型数组排序 2、对char类型排序 3、对浮点型排序 4.比较字符串 4.1按首字母排序 4.2按长度排序 4.3按字典顺序 5.结构体排序 5.1 多级排序 三、模拟实现qsort函数 【冒泡排序的实现】 【主函数部分】 【代码详解】  【代码实现之整

    2024年02月13日
    浏览(39)
  • C语言快速排序——qsort函数

      上面的是我们标准C语言库里面对qsort函数的介绍,我们先来从排序说起:  这就不得不提出编程中最最基础的排序算法--- 冒泡排序  对于一个任意的无序数列,我们如果想要把他排成顺序数列的话,我们就可以让每一项跟后面的一项去比较,然后交换两个数,最终得到一个

    2024年01月22日
    浏览(51)
  • C语言——qsort()函数_学习笔记

    qsort()函数是一个库函数,包含在头文件 stdliib.h中,用来对数据进行排序操作的函数,它可以排序 任意类型的数据 !!! qsort()函数排序是 从小到大 排序,内部是采用 快速排序 思想排序数据的。qsort()函数有四个参数,解释如下: 第一个参数 void* base 。类型是 void* 类型的,

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包