若对指针的理解还有问题的或不懂得地方,可通过此链接:https://blog.csdn.net/FSRMWK/article/details/136494868?spm=1001.2014.3001.5501,进行复习与补充
在上期我们从指针的基础概念出发,再到对常见指针类型的讲解,相比大家对与指针的理解应该不成问题。这期博客主要就是对:函数指针应用(回调函数)、函数指针数组的应用(转移表)、与指针有关联的知识点等进行深入讲解
一、指针的应用
1.转移表
- 转移表就是函数指针数组;将所需要的函数的指针,存储在一个数组中,通过数组得下标去调用函数,这样就能避免代码的冗余。使得代码又清晰,又简化。
//转移表代码实践->计算器功能得实现 #include<stdio.h> void menu() { printf("************************\n"); printf("**** 0.exit 2.sub ****\n"); printf("**** 1.Add 3.Mul ****\n"); printf("**** 4.div 5.Mor ****\n"); printf("************************\n"); } int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int Mor(int x, int y) { return x % y; } typedef int(*Fun[])(int, int); int main() { Fun pf = { 0, Add,Sub ,Mul,Div,Mor }; int input = 0; do { menu(); printf("请下指令:>"); scanf("%d", &input); if (input <= 5 && input >= 0) { int m, n; printf("请输入两个操作数:>"); scanf("%d%d", &m, &n); int ret = pf[input](m, n); printf("%d\n", ret); } else { (input == 0 ? printf("关闭计算机\n") : 1); continue; } } while (input); return 0; }
3.回调函数
- 回调函数就是⼀个通过函数指针调⽤的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应
4.qsort函数
- 排序神器——qsort函数之详解-CSDN博客
- 此链接是专门讲解得qsort函数的功能以及用法
- 快速排序【全方面讲解快排,此文足以彻底扫盲】-CSDN博客
- 此链接则是针对qsort函数内部的代码实现逻辑进行讲解——快速排序
5.回调函数小试牛刀---冒泡排序模拟qsort的功能
二、与指针有关联的知识点
1.sizeof与strlen
- sizeof:
- 关键字
- 计算变量的类型在内存中所占用字节的大小,也就是说它括号里面的式子不参与计算,仅仅判断一下最终结果的类型,然后计算该类型在内存中所占用字节的大小,后返回回来。
- strlen:
- 库函数,使用的时候,需要包含<string.h>头文件
- 计算字符串'\0'之前的元素个数,也就说,strlen的停止条件是遇到'\0';所以strlen只能计算字符串的长度。
2.数组名含义
- 一维数组的数组名:
- 一般情况数组首元素的地址
- 除了关键字sizeof后面的数组名,与&数组名
- 二维数组的数组名:
- 一般情况数组首元素的地址
- 除了关键字sizeof后面的数组名,与&数组名
- 二维数组的元素是?
- 二维数组是将每一组一维数组当作它的元素。
- 所以数组的首元素的地址是第一行数组的地址,