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

目录

0.函数指针

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

2.回调函数

3. qsort 排序函数

3.1 冒泡排序

3.2 qsort 函数

3.2.1 qsort 实现整型排序

3.2.2 qsort 实现浮点型排序

3.2.3 qsort 实现结构体排序


0.函数指针

【C语言进阶】指针进阶(回调函数、qsort)_第1张图片

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

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

【C语言进阶】指针进阶(回调函数、qsort)_第2张图片

  • 函数指针数组:转移表

【C语言进阶】指针进阶(回调函数、qsort)_第3张图片

2.回调函数

 【C语言进阶】指针进阶(回调函数、qsort)_第4张图片

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

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

3. qsort 排序函数

3.1 冒泡排序

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

【C语言进阶】指针进阶(回调函数、qsort)_第5张图片

3.2 qsort 函数

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

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

qsort函数的格式:

四个参数:

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

【C语言进阶】指针进阶(回调函数、qsort)_第6张图片

 

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

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

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

【C语言进阶】指针进阶(回调函数、qsort)_第7张图片

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

3.2.1 qsort 实现整型排序

【C语言进阶】指针进阶(回调函数、qsort)_第8张图片

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

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

【C语言进阶】指针进阶(回调函数、qsort)_第9张图片

3.2.2 qsort 实现浮点型排序

【C语言进阶】指针进阶(回调函数、qsort)_第10张图片

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

3.2.3 qsort 实现结构体排序

结构体排序:age

【C语言进阶】指针进阶(回调函数、qsort)_第11张图片

结构体排序:name

字符串排序用 strcmp 

【C语言进阶】指针进阶(回调函数、qsort)_第12张图片 

 

你可能感兴趣的:(【C语言学习】,c语言,开发语言)