说明:本小结更倾向于'理解'
一 前期回顾
二 数组参数
思考:在写代码的时候如果要把"数组"或者"指针"传给函数,那'函数的参数'该如何'设计'呢?
① 一维数组传参
备注:指针数组的'首元素'是一级'指针';指针数组的'数组名'对应'该指针的地址',需要'二级'指针来接收
② 二维数组传参
③ 小结
既可以写成'数组[大写可省略]',也可以写成'指针[合理的指针类型]'
三 指针参数
说明:针对'函数'的
① 一级指针传参
思考:当一个'函数的参数'部分为'一级指针'的时候,函数能'接收'什么参数?
void test1(int *p) {
//test1函数能接收什么参数?
}
② 二级指针传参
思考:当函数的参数为'二级指针'的时候,可以接收'什么参数'?
四 函数指针
① 基本概念
函数指针是'指向'函数的指针,'存放'的是'函数的地址',函数的'地址'是什么?
② 如何保存函数的地址
++++++++++'解读'++++++++++
1)pfun1先和*结合,说明pfun1是'指针' -->()结合-->'优先级'问题
2)然后与('参数类型')结合指针指向的是一个'函数'
3)指向的函数类型-->'返回值类型'为void
备注:使用'函数地址'调用函数
③ 小结
指针-->指向的是'什么'? -->思考:用'什么'来接收
④ 习题分析
++++++++++++++"理解这两段代码的含义"++++++++++++++
核心:理解'函数指针'类型;去掉'指针名'就是了
//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int);
1)代码1
+++++++++++++++"变量的类型"+++++++++++++++
1) int a; // 普通-->整数类型-->类型在'前'、变量名在'后'
2) void (*pfun1)(int) // '正确'
函数指针的'类型':void (*)(int)
'error': void (*)(int) pfun1 -->不能参照'int a'来理解
(*(void (*)())0)();
1)(类型)0 -->'强制'类型转换;这里把'0'当作'函数的地址'
2)类型:void (*)() -->无参的'指针类型' -->调用时候'只需要类型'即可,不需要'变量名'
3)(*函数指针变量)(); -->'调用函数'
"* 解引用" -->指向'指针'指向的对象
小结:函数的'调用'
2)代码2
思考:代码2'太复杂',如何'简化'? --> typedef'重新'定义类型
⑤ *在函数指针的问题
五 函数指针数组
① 声明和使用
1) 数组是'存放相同(same)类型'数据的存储空间
2) 函数指针数组:把'函数的地址'存到一个'数组中',数组的'元素'都是函数指针
② 练习
③ 案例讲解
函数指针数组'场景' --> "转移表"
1)代码
2)结果
3)解决冗余问题
六 指向函数指针数组的指针
细节: 指针'指向数组'的时候,最好指定'[number]'
指向"函数指针数组"的指针是一个 指针,'指针指向一个数组',数组的'元素'都是 '函数指针'
七 回调函数
① 概念
② 案例
③④⑤⑥