四川移动端网站建设,网站切图谁来完成,免费网站能到百度首页吗,北京的外包公司有哪些上节回顾#xff1a;
C语言指针#xff08;六#xff09;——函数指针数组
上一节我们学习了函数指针数组#xff0c;它让菜单驱动的代码变得简洁优雅。通过将多个函数指针存储在一个数组中#xff0c;我们彻底摆脱了繁琐的switch语句#xff0c;实现了代码的高扩展性。…上节回顾C语言指针六——函数指针数组上一节我们学习了函数指针数组它让菜单驱动的代码变得简洁优雅。通过将多个函数指针存储在一个数组中我们彻底摆脱了繁琐的switch语句实现了代码的高扩展性。今天我们要在这个基础上更进一步学习指针的终极套娃——指向函数指针数组的指针。别被名字吓到其实理解了本质你会发现它很简单。指向函数指针数组的指针一、为什么需要这个套娃指针先思考一个问题既然函数指针数组这么好用为什么还要学指向它的指针答案很实在实际开发中确实很少直接使用。但学习它有重要价值理解C语言类型系统的完整性能看懂任何复杂的C语言声明面试时展示扎实的指针功底为理解更复杂的系统代码打下基础就像学习数学公式你可能不会天天用但懂了之后看世界的方式会不同。二、什么是指向函数指针数组的指针让我们用最直白的方式解释函数指针指向单个函数的指针函数指针数组存放多个函数指针的数组指向函数指针数组的指针指向这个数组的指针简单说这是一个指针它指向一个数组而这个数组里存的全是函数指针。三、如何定义不必着急我们一步一步来~第1步先定义函数指针数组// 定义一个函数指针数组包含3个元素 int (*funcArr[3])(int, int);第2步取这个数组的地址funcArr // 这就是指向函数指针数组的指针类型第3步定义指针变量存储这个地址int (*(*p)[3])(int, int) funcArr;我们来解析一下这一长串int (*(*p)[3])(int, int)*pp是一个指针(*p)[3]p指向一个包含3个元素的数组*(*p)[3]数组的每个元素是指针(int, int)这些指针指向的函数接受两个int参数最前面的int函数返回int类型四、用typedef让代码变清晰对于复杂声明typedef是救命稻草// 第1步定义函数指针类型 typedef int (*FuncPtr)(int, int); // 第2步用这个类型定义数组 FuncPtr funcArr[3]; // 第3步定义指向这个数组的指针 FuncPtr (*p)[3] funcArr;看用了typedef代码立刻变得简单多了五、简单示例#include stdio.h // 两个简单的测试函数 int Add(int a, int b) { return a b; } int Sub(int a, int b) { return a - b; } int main() { // 定义函数指针数组并初始化 int (*funcArr[2])(int, int) {Add, Sub}; // 定义指向这个数组的指针 int (*(*p)[2])(int, int) funcArr; // 使用数组直接调用 printf(直接使用数组\n); printf(Add(10, 5) %d\n, funcArr[0](10, 5)); printf(Sub(10, 5) %d\n, funcArr[1](10, 5)); // 通过指针调用 printf(\n通过指针调用\n); printf(Add(10, 5) %d\n, (*p)[0](10, 5)); // 先解引用p得到数组 printf(Sub(10, 5) %d\n, (*p)[1](10, 5)); // 查看地址 printf(\n地址信息\n); printf(funcArr地址%p\n, funcArr); printf(funcArr地址%p\n, funcArr); printf(p存储的地址%p\n, p); return 0; }运行结果直接使用数组Add(10, 5) 15Sub(10, 5) 5通过指针调用Add(10, 5) 15Sub(10, 5) 5地址信息funcArr地址0x7ffc5a3b2b20funcArr地址0x7ffc5a3b2b20p存储的地址0x7ffc5a3b2b20六、注意点1.funcArr和funcArr的区别虽然打印的地址值相同但类型完全不同funcArr类型是int (**)(int, int)指向函数指针的指针funcArr类型是int (*(*)[2])(int, int)指向数组的指针2. 指针运算的差异printf(funcArr 1 %p\n, funcArr 1); // 前进8字节一个指针大小 printf(funcArr 1 %p\n, funcArr 1); // 前进16字节整个数组大小这就是为什么类型很重要——决定了指针运算的步长。3. 如何正确访问// 正确先解引用再下标访问 int result1 (*p)[0](10, 5); // 错误试图直接下标访问 int result2 p[0](10, 5); // 编译错误记住要先解引用才能取元素七、总结本节我们了解了什么指向是函数指针数组的指针并了解了它的简单用法。本节内容不做重点只需了解即可考试和实际开发使用的并不多。完结撒花指针系列的探索之路至此已抵达终点。从最基础的指针概念出发我们一路经历了字符指针、指针数组、数组指针的层层递进攻克了函数指针这一重要关口直至本篇的指向函数指针数组的指针。这一路走来宛如攀登一座知识的山峰每一步都见证了思考的深度。学习指针的道路绝非坦途相信许多同学都曾经历过困惑与挣扎——那些面对复杂声明时的迷茫调试指针错误时的挫败都是成长路上必经的风景。不必焦虑更不必自我怀疑因为每一位C语言学习者都曾走过相似的路径。回顾我的学习历程也是通过一行行代码的实践、一篇篇笔记的积累、一次次错误的修正才逐渐拨开迷雾看清指针世界的真实面貌。我相信所有真诚的努力都不会被辜负愿大家在编程的道路上一往无前用代码书写属于自己的精彩篇章希望讲解的内容能帮助到各位同学如有错误或更好的建议还望指出 ~谢谢大家