C语言-回调函数

回调函数是通过函数指针调用的函数,常用于如qsort的排序操作。本文介绍了qsort的使用,包括其参数解析,并展示了如何自定义比较函数实现升序或降序排序。此外,还探讨了不同数据类型的比较函数及其应用场景,并用冒泡排序模拟了qsort的功能。
摘要由CSDN通过智能技术生成

回调函数

回调函数是通过一个函数指针调用的函数,就是把一个函数的指针作为参数传递给另一个函数,当这个指针被调用时,我们就说这就是回调函数。

一个简单的例子就是qsort函数,它就是通过地址找到那个函数在调用

在这里插入图片描述

可以看到qsort函数有四个参数
第一个参数void* base是接受要排序的数组
第二个参数size_t num,是数组元素的总和
size_t是typedef把unsigned int重定义为size_t
第三个参数size_t width是数组一个元素的大小
第四个参数 int(compare)(const void elem1,const void* elem2)是一个函数指针,用来接受用户自己写的比较函数,至于__cdecl是一个函数调用约定,先不管

在这里插入图片描述

看比较函数的返回值,这里的返回值决定要排序的数组是升序还是降序,默认是升序

qsort的使用

int int_cmp(const void*e1,const void* e2)
{
   
	return *(int*)e1 - *(int*)e2;			//这里把数组排序成升序
}

//这里给一个整型数组
int main()
{
   
	int arr[] = {
    9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);		//计算数组元素个数
	qsort(arr, sz, sizeof(arr[0]), int_cmp);	//int_cmp是用户自己写的比较函数,函数名也是函数地址
	int i=0;
	for(i=0;i<sz;i++)
	{
   
		printf("%d ",arr[i]);
	}
}

在这里插入图片描述

这里要是想降序排序,可以把int_cmp函数里的e1和e2交换位置

void*表示可以接受任何数据类型的地址
不能直接对void*进行+-整数的操作
不能直接对void*进行解引用操作

各个数据类型的比较函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print(int arr[], int sz)
{
   
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值