【C语言进阶】指针进阶(回调函数、qsort)

本文深入探讨了函数指针的概念,包括如何声明和使用指向函数指针数组的指针。回调函数的原理和应用也在文中得到阐述,通过传递函数地址实现间接调用。此外,重点讲解了C标准库中的qsort函数,它是实现任意类型数据排序的通用工具,详细解析了其参数意义及使用方法,并给出了整型、浮点型以及结构体排序的实例。通过对compare函数的定制,qsort能灵活地适应不同类型的数据排序需求。
摘要由CSDN通过智能技术生成

目录

0.函数指针

1.指向函数指针数组的指针

2.回调函数

3. qsort 排序函数

3.1 冒泡排序

3.2 qsort 函数

3.2.1 qsort 实现整型排序

3.2.2 qsort 实现浮点型排序

3.2.3 qsort 实现结构体排序


0.函数指针

1.指向函数指针数组的指针

  • *ppfArr 说明变量 ppfArr 是一个指针
  • 指针 [4] 指向的是一个数组,有4个元素
  • 每个元素类型都是int (*)(int,int) 函数指针类型

  • 函数指针数组:转移表

2.回调函数

 

  • 把Add函数传递给pf指针(275行),通过pf去调用所指向的Add函数(259行)。

  • 函数的地址传递给一个指针, 在函数内部通过指针调用函数的时候被调用的函数就是回调函数。通过地址在调用函数

3. qsort 排序函数

3.1 冒泡排序

冒泡排序只能排整型数据、不能排浮点型、结构体等等

3.2 qsort 函数

qsort 函数,实现任意类型数据排序的函数

quick sort 快速排序,需要引头文件 stdlib.h

qsort函数的格式:

四个参数:

  • base:目标数组的起始位置,需要给定一个指针
  • num:元素的个数
  • width:一个元素占多少字节,可以用 sizeof 给定
  • compare :比较两个元素的函数,也就是回调函数。由于不同数据间比较方法不同,所以这里需要给定一个比较方法的函数,到时候 qsort 就会自己调用。

 

compare里面具体讲解:(方法实现必须和qsort参数一样

elem1、elem2 要接收两个数据,void* 说明是两个无类型的指针

void* :无类型的指针,可以接收任何类型的指针,不需要强制类型转换,也不会报类型不兼容的警告。

  • 为了满足qsort能够实现任意类型的转换
  • 但是因为 void* 没有类型,所以不能解引用,系统不知道访问几个字节
  • 又因为 void* 没有类型,所以++的时候或者 + - 整数的时候,不知道指针的步长,所以也不能进行 + - 整数的操作

3.2.1 qsort 实现整型排序

compare传递的方法:方法实现严格一致

  •  int 函数名 (const void* e1, const void*e2) 
  • 因为这里排序整型,所以将 e1 强制转换为整型。
  • 不能写成 (int*)*e1 ,因为 void* 空类型不能解引用

3.2.2 qsort 实现浮点型排序

  •  方法一样的写法,只不过最后要返回 int 整型
  • 所以需要最后的结果要强制转换成 int

3.2.3 qsort 实现结构体排序

结构体排序:age

结构体排序:name

字符串排序用 strcmp 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ai 医学图像分割

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值