0基础 三个月掌握C语言(9)

深入理解指针(4)

1.回调函数是什么?

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

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

在这里add sub mul div就是回调函数

2.qsort使用举例

qsort-----是个库函数  直接是可以用来排序数据  底层使用的是快速排序的方式

qsort可以排序任意类型的数据

现在我们对一组整型数据进行排序 我们之前是使用冒泡来写的  如下

我们看到它的传的数组是int类型  所以这个函数只能排序整型元素 当然我们可以在传递的时候 改变类型 但这也没qsort方便

qsort的定义方式:

关于qsort 我们这里简单讲一下

如果第一个元素应该出现在第二个元素之前,则返回一个负数。

如果两个元素相等,则返回零。

如果第一个元素应该出现在第二个元素之后,则返回一个正数。

这里需要注意的是qsort 的排序方式是通过比较函数compar来决定的,而不是通过其返回值。

例如:

使用qsort函数

这里的compar是个函数指针 指向的就是两个元素的比较函数(用于比较两元素大小)

接下来我们来定义这个比较函数

由于我们只需要进行比较 并不需要进行修改 所以我们用const限制 *p

使p指向的元素不被修改

void* 指针--是无具体类型的指针  它的作用就是可以接受任何类型的地址

接下来我们用qsort排序一下结构体如何

首先我们先来补充一下之前未讲的知识点

结构体成员间接访问操作符( . )和( -> )

结构体名.结构体元素

结构体指针->结构体元素

在用qsort排序结构体时 我们想到有几个问题

这里的两个结构体元素怎么比较大小

是规定按名字比--(字符串比较)

还是按年龄比较--(整型比较)

So cool

我们成功啦!

qsort函数的模拟实现

我们之前是使用冒泡排序来让一个数组元素实现升序

如图

那我们能不能模仿qsort来创建一个函数来排序整型数据呢

当然可行

如下图

现在我们对代码进行解读  width代表该数组元素的类型大小(int--4字节)

我们这里用char* 作为参数类型以及强制类型转换的目的就是 char占一个字节空间 我们可以通过使用char 来处理任何类型的指针  因为任何类型的指针都可以隐式地转换为char*

这里 首先j=0   cmp函数的前一个base指向数组首元素(9)   第二个base指向下标为1的元素(8)

进入比较函数  我们可知返回值大于0  随即进入到交换函数

9在内存中是占4个字节 且是倒着存的  (09  00  00  00)---buf1指向首地址

(08  00  00  00)--buf2指向首地址  这里的width是4(单位为字节) 所以我们循环4次 一次交换一个字节(09先和08交换 然后一对一对交换)

该代码与qsort相比较 我们就可以得出在使用qsort时 我们只需要给一个比较函数 其他的形如交换 循环 其实已经在qsort内部实现了 我们不用写

那我们能不能用冒泡排序 来实现一个对任意类型都能排序的函数

现在我们要进行改造了

改造前 我们把可能要遇到的问题列出来

1.修改形参的类型(如上图的int)--让这个函数能接受任意类型的数据

2.修改比较方法--让比较函数能够比较任意类型的数据

3.由于类型不同 我们冒泡排序中的交换代码也需要修改

然后我们上代码

strcmp用于比较两个字符串  基本和qsort差不多

只需要给其一个比较函数即可

Good!

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值