复习指针(16)
<1>函数指针数组
a.
- 把函数的地址存放到一个数组中,那这个数组就叫函数指针数组
是int ( * ) ( )类型的函数指针
- parr1先和[]结合,说明parr1是数组, 碰到右 ) 括号反转, * 告诉我们它的元素是指针类型, 又碰到 ( 左括号反转 , ()告诉我们是函数, 最后int告诉我们它的返回类型是整数
- 注意:c语言的声明解读遵循左右法则 (从变量名开始,先左后右,遇到括号反转)
b.
- 非常简易版的四则运算计算机
上面是基础功能
这个本质是数组,在有parr[ i ]这种结构中,c语言规则会让其等价于 *( parr + i )
然后找到相应的运算地址,再将( )括号里的9 与 3带入
<2>转移表
a.
- 我们用switch来实现选择功能
很明显这段代码非常的冗余,重复内容太多,效率低下,然后我们观察重复内容和不一样的地方,是否可以包成一个函数!
b.
- 于是乎 用到函数指针数组
<3>回调函数
- 回调函数就是一个通过 函数指针 调用 的函数 ---- 就是在一个函数里通过函数指针去调用另一个函数
- 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数
<4>qsort使用举例
- 是C语言中提供的一个排序函数,是一种基于快排排序算法思想的一种排序算法
- 它的头文件是 stdibl.h
- 1.现成的排序算法,学会了直接可以使用
2.大部分情况下,效率都比冒泡排序高
3.qsort函数可以排序任何类型的数据
- 使用规则
注意:compar这个函数(名字可以修改)是要自己写的,就是告诉qsort怎么比较 传递的值
定义时,严格 int (name) ( const void* p1, const void* p2) { 怎么比较 ,内容}
- 这个的意思就是,返回的值只分3种情况
<0 ----- p1 < p2 ,将p1放置p2后,
=0 ----- p1 = p2,就是位置不变
>0 ----- p1 > p2,将p1放置p2前
https://legacy.cplusplus.com/reference/cstdlib/qsort/?kw=qsort
c语言关于qsort详细内容
1.使用qsort函数排序整型数据
- 这里有这个要注意的点: void* p1 像这种参数使用时,要强制转换一下类型,比如
2.使用qsort排序数据结构
- 补充一个小知识 . 与 -> 的使用
区别图上文字有
注意strcmp的使用:
1.它的头文件是string.h
2.strcmp只能比较字符串,而且比较的本质是逐位ASCII值的大小
怎么比较的呢? 从第一个字符开始比,谁的ASCII值大,谁的字
符串就更大,一旦不一样立刻分出结果,后面不看
3.对于返回值 0代表相等, 正数代表前字符串大, 负数代表后字符串大
3.模拟qsort使用
- 这个是主要的,核心代码(泛型编程)
- 对于打印函数,和比较函数略微有所不同(稍后再提)
这个有所不同 有点像 插件 的感觉 哈哈
- 先说比较厉害的地方(根本想不到):
1.既然模拟是qsort库函数,那么void budlle_sort2的4个参数类型就可以理解了
2.较难的是,不同类型的数据怎么处理,有4个字节 or 8个字节等,于是我们可以缩小单位,以一个字节方式处理
(char*)base 就把 首元素地址第一个字节取了下来( 把首元素的地址拆成多份 取第1份 )
width是一个元素的大小
(char*)base + j * width 代表第j个元素
3.看到交换函数,有意思的
它的意思是将地址的多份 分批一次一次的交换,直到多份全部交换完后,两个元素才真正的互相交换完毕
我当时突然想为什么有 * 解引用 ? 其实呢,地址就像门牌号,解引用地址就是房里的东西
a. 传参时整数类型
就这两个函数不一样
b.传的参数是结构体
这里的代码与结构体那里一样,函数嘛,重复使用,像一个插件样
你好读者,当你看到这里,说明我写内容,你感兴趣,如果你有什么意见 or 发现了错误 可以告诉我
