《重生到现代之从零开始的C语言生活》—— 指针6

回调函数

回调函数就是通过函数指针调用的函数

如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数

假设函数a是一个普通的函数,函数b的形参为函数指针变量,我们在主函数中调用函数b,并将函数a的地址传递给b,那么函数b中的函数指针变量中储存的就是函数a的地址,在函数b中解引用函数指针变量解引用的是函数a,就可以使用函数a,函数a就是回调函数

举个例子:

c 复制代码
int add(int x,int y)
{
    return x+y;
}
void test (int (*p)(int x,int y))
{
    int r = p(2,3);//p=add,解引用p就是add函数
    ...
}
int main ()
{
    test(add);//调用test函数,但是传的是add函数的地址
    ...
    return 0;
}

回调函数不是由该函数的实现方(例子中的主函数)直接调用,而是在特定的事件或条件发生时有另一方调用的(在上述例子中是被test函数调用),用于对该事件或条件进行响应

qsort函数

大家应该都听过冒泡排序,其实如果想在程序里实现排序的效果,有一个更简单的函数可以帮助我们实现,它就是qsort函数

qsort函数是一个库函数,可以直接使用,方便的是他能排列任意类型的数据,排列的方法是快速排列

qsort函数的表现形式很奇怪,如下:

c 复制代码
void qsort(void * base//base中存放的是待排数组的第一个元素的地址
           size_t num//num中存放的是base指向的数组中的元素个数
           size_t size//size是base指向数组中的一个元素的大小,单位是字节
           int (*compar)(const void*e1,void*e2)//函数指针指向了一个比较函数
           //这个比较函数就是用来比较数组中两个元素的大小
           //如果e1指向的函数大于e2指向的元素,那么函数返回>0的数字
           //如果e1指向的函数小于e2指向的元素,那么函数返回<0的数字
           //如果e1指向的函数等于e2指向的元素,那么函数返回0
           )

其中前三个参数可能比较好理解,最难理解数最后一个比较函数是什么

可以这么理解,最后一个比较函数是我们自己写的函数

作为qsort函数的使用者,我们在使用函数的时候需要提供一个函数,函数要实现自己希望的元素类型之间的比较

比如我们要比较整型元素之间的元素。我们就要自己写一个比较整型元素的函数

举个例子:

c 复制代码
int cmp_int(const void* e1, const void* e2)
{
	if (*(int*)e1 > *(int*)e2)//void类型不能解引用,所以我们要强制转换为int类型
		return 1;
	else if (*(int*)e1 < *(int*)e2)
		return -1;
	else
		return 0;
}

这时我们自己写的一个比较函数,用来比较整型,符合条件"如果e1指向的函数大于e2指向的元素,那么函数返回>0的数字,如果e1指向的函数小于e2指向的元素,那么函数返回<0的数字,如果e1指向的函数等于e2指向的元素,那么函数返回0"

qsort函数默认从小到大排列,如果想倒序排列我们就要将比较函数中的条件颠倒

大概的运用如下:

c 复制代码
#include <stdlib.h>//qsort函数的头文件
#include <stdio.h>
int cmp_int(const void* e1, const void* e2)
{
	if (*(int*)e1 > *(int*)e2)//void类型不能解引用,所以我们要强制转换为int类型
		return 1;
	else if (*(int*)e1 < *(int*)e2)
		return -1;
	else
		return 0;
}

int main ()
{
	int arr[10] = { 3,1,9,8,5,4,0,2,7,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}

今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!
祝看到这里的人天天开心哦(笔芯)

相关推荐
李永奉39 分钟前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
爱吃苹果的日记本3 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
aramae6 小时前
模拟实现strstr函数(C语言)
c语言·开发语言·算法
多弗朗皮卡丘8 小时前
数据结构4:链表(下)
c语言·数据结构·链表
我的小卷呀8 小时前
Linux ip 命令底层逻辑与实战指南
linux·运维·c语言·网络协议·tcp/ip·网络安全
luj_17689 小时前
中锋卡位与开放线博弈
c语言·开发语言·网络·经验分享·算法
未来之窗软件服务9 小时前
计算机二级[英文]-C 逻辑运算和fopen—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
YIN_尹9 小时前
【Linux系统编程】模拟实现一个最简版C语言标准IO库
linux·服务器·c语言
智闲电子设计12 小时前
RS485 总线实战:终端电阻、差分信号、半双工方向控制,工程里最容易翻车的几处
c语言·stm32·单片机·嵌入式硬件
luj_176812 小时前
罚球线右移破防新策略
c语言·开发语言·网络·经验分享·算法