网站建设推广怎么做个人建站需要多少钱

张小明 2025/12/28 1:28:04
网站建设推广怎么做,个人建站需要多少钱,建行网站企业网银,做企业信用贷的网站上节回顾#xff1a; C语言指针#xff08;五#xff09;进阶篇——函数指针 上一篇#xff0c;我们吃透了函数指针的核心知识#xff0c;知道了函数指针是指向函数入口地址的指针#xff0c;能通过它间接调用函数、实现回调机制#xff0c;还用函数指针优化了计算器的…上节回顾C语言指针五进阶篇——函数指针上一篇我们吃透了函数指针的核心知识知道了函数指针是指向函数入口地址的指针能通过它间接调用函数、实现回调机制还用函数指针优化了计算器的代码减少了重复逻辑。但当时的代码仍依赖switch语句匹配菜单选项和函数有没有更简洁的方式当然这就需要用到函数指针的 “加强版”——函数指针数组它能批量管理多个函数指针是实现 “菜单驱动” 功能的核心技术让代码的耦合度更低、扩展性更强。很多同学会觉得 “函数指针数组” 听起来复杂其实它就是我们之前学过的指针数组和函数指针的结合体指针数组是 “存指针的数组”而函数指针数组就是 “存函数指针的数组”。今天我们就用通俗的例子和代码把这个知识点彻底搞懂函数指针数组一、函数指针数组本质存放函数指针的数组。在学习函数指针数组之前我们先复习两个之前学过的知识——指针数组、函数指针指针数组本质是数组元素是指针如int* arr[5];元素的类型为 int*函数指针本质是指针指向的是函数的入口地址。如int (*p)(int int);指向返回值类型为 int, 参数列表为int int的函数那么函数指针数组的概念就很明确了其本质就是数组数组中存放的元素是相同类型的函数指针。二、函数指针数组的定义格式易错返回值类型 (*数组名[数组长度])(函数参数类型列表);int (*arr[5])(int, int);函数指针数组的定义格式是在函数指针的基础上增加了数组的标识[];很多同学会把函数指针数组的定义写错核心还是没掌握优先级正确写法int (*arr[5])(int, int)先arr[5]是数组再*是函数指针错误写法int* arr[5](int, int)这是非法格式编译器会直接报错因为[]和()的优先级混乱。记住一个口诀先认数组再认指针—— 先看到[]确定是数组再看*确定数组元素是函数指针。三、基础示例我们先定义加减乘除四个函数再用函数指针数组存储它们的地址#include stdio.h // 定义四个函数参数、返回值类型完全一致 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) { if (y 0) { printf(错误除数不能为0\n); return 0; } return x / y; } int main() { // 定义并初始化函数指针数组元素依次是Add、Sub、Mul、Div的函数指针 // 注意数组下标可以和菜单选项对应这里我们先从0开始 int (*funcArr[4])(int, int) {Add, Sub, Mul, Div}; // 打印数组中每个元素函数指针的地址 for (int i 0; i 4; i) { printf(funcArr[%d]的地址%p\n, i, funcArr[i]); } return 0; }运行结果funcArr[0]的地址00401000funcArr[1]的地址00401020funcArr[2]的地址00401040funcArr[3]的地址00401060这个例子中funcArr 为函数指针数组的数组名数组中元素是类型为 int(*)(int, int) 的函数指针。如果上面这段代码你可以看懂并理解的话那么我们就可以来试着更进一步的优化一下上一节中简单计算器的代码四、核心用法简化菜单驱动程序#include stdio.h // 菜单函数 void Menu() { printf(----------------------------------\n); printf(--------- 1. add -----------\n); printf(--------- 2. sub -----------\n); printf(--------- 3. mul -----------\n); printf(--------- 4. div -----------\n); printf(--------- 0. exit ----------\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) { if (y 0) { printf(错误除数不能为0\n); return 0; } return x / y; } int main() { int input 0; int x 0, y 0, ret 0; // 定义函数指针数组下标0留空对应菜单的0退出1-4对应加减乘除 // 这样可以让菜单选项和数组下标直接对应无需额外匹配 int (*funcArr[5])(int, int) {NULL, Add, Sub, Mul, Div}; do { Menu(); printf(请输入选择\n); scanf(%d, input); // 核心逻辑通过input判断是否退出否则直接调用数组中的函数 if (input 1 input 4) { printf(请输入两个操作数\n); scanf(%d %d, x, y); // 关键input是菜单选项直接作为数组下标调用对应的函数 ret funcArr[input](x, y); printf(结果%d\n, ret); } else if (input 0) { printf(退出计算器\n); } else { printf(输入错误请重新选择\n); } } while (input); return 0; }运行结果示例---------------------------------- --------- 1. add ----------- --------- 2. sub ----------- --------- 3. mul ----------- --------- 4. div ----------- --------- 0. exit ---------- ---------------------------------- 请输入选择 1 请输入两个操作数 10 5 结果15 ---------------------------------- --------- 1. add ----------- --------- 2. sub ----------- --------- 3. mul ----------- --------- 4. div ----------- --------- 0. exit ---------- ---------------------------------- 请输入选择 4 请输入两个操作数 10 0 错误除数不能为0 结果0 ---------------------------------- --------- 1. add ----------- --------- 2. sub ----------- --------- 3. mul ----------- --------- 4. div ----------- --------- 0. exit ---------- ---------------------------------- 请输入选择 0 退出计算器这段代码的精髓就在于——菜单选项和函数指针数组的下标直接对应函数指针数组funcArr的下标 0 设为NULL对应菜单的 0 退出下标 1-4 分别对应 Add、Sub、Mul、Div对应菜单的 1-4当用户输入input后只需判断input的范围直接用funcArr[input](x, y)调用对应的函数彻底去掉了switch语句如果后续要增加功能比如取模只需添加一个取模函数再把函数指针加入数组修改菜单即可无需改动核心逻辑 —— 这就是高扩展性。对比上一篇的代码你会发现函数指针数组让菜单驱动程序的代码变得极其简洁这也是它在实际开发中最常用的场景。五、注意事项数组中所有函数指针的类型必须一致函数指针数组的每个元素都是同一类型的函数指针这意味着它们指向的函数必须返回值类型相同、参数类型及顺序完全相同。比如不能把char Add(int x)的函数指针存入int (*funcArr[])(int, int)数组中否则会导致编译错误。数组下标与菜单选项的对应要合理在菜单驱动程序中通常会把数组下标 0 留空对应退出选项让菜单选项 1、2、3... 直接对应数组下标 1、2、3...这样能避免下标越界或匹配错误。避免越界访问数组和普通数组一样函数指针数组也不能越界访问。比如定义了长度为 5 的数组funcArr[5]就不能访问funcArr[5]或funcArr[6]否则会访问到无效的内存地址类似野指针导致程序崩溃。不要直接调用 NULL 的函数指针如果数组中的某个元素是NULL比如我们例子中的funcArr[0]不要直接调用它否则会访问无效内存。在调用前要先判断下标是否在合法范围内。总结本节我们学习了函数指针数组的内容并通过实例展示了函数指针数组的实际用途了解了函数指针数组是如何简化代码的并提高代码的扩展性。希望同学们能亲手敲一遍实例代码好好分析函数指针数组的应用逻辑我相信通过多思考多动手多练习你一定能成为编写代码的高手下一节我们将学习更进阶的指针知识 ——指向函数指针数组的指针这是指针的 “终极形态” 之一虽然实际开发中用得不多但能帮你彻底理解指针的层级关系。希望讲解的内容能帮助到各位同学如有错误或更好的建议还望指出 ~谢谢大家
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发总结与未来展望php网站开发需要学什么

LangFlow Excel数据分析与可视化报告生成 在企业日常运营中,Excel 依然是最广泛使用的数据处理工具之一。从销售报表到财务对账,从业绩分析到库存管理,大量关键决策都依赖于表格中的数字。然而,随着数据量增长和业务复杂度提升&am…

张小明 2025/12/23 12:20:15 网站建设

DW做网站的步骤纯html5网站源码

MinerU配置文件缺失问题的深度解析与3种高效解决方案 【免费下载链接】MinerU A high-quality tool for convert PDF to Markdown and JSON.一站式开源高质量数据提取工具,将PDF转换成Markdown和JSON格式。 项目地址: https://gitcode.com/OpenDataLab/MinerU …

张小明 2025/12/23 12:18:13 网站建设

方案网站有哪些举例说明网络营销的方法有哪些

第一章:云原生 Agent 的 Docker 网络配置在构建云原生 Agent 时,Docker 网络配置是确保服务间通信、外部访问与安全隔离的关键环节。合理的网络设计不仅能提升系统稳定性,还能增强微服务架构的可维护性。自定义桥接网络的创建与使用 Docker 默…

张小明 2025/12/23 12:16:12 网站建设

为什么做图书管理网站北京站网站建设

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Nginx一键安装1.1基础环境,关闭防火墙与SELinux1.2 安装编译依赖1.3创建Nginx运行用户1.4编译安装Nginx1.5创建软链接1.6.检查、启动、重启、停止…

张小明 2025/12/25 19:19:33 网站建设

网站内容页怎么设计模板壹佰网站建设

Qdrant向量数据库:构建跨模态智能搜索系统的核心技术解析 【免费下载链接】qdrant Qdrant - 针对下一代人工智能的高性能、大规模向量数据库。同时提供云端版本 项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant 在人工智能应用日益普及的今天&…

张小明 2025/12/23 12:12:10 网站建设

如何在图片上添加文字做网站浙江大成建设集团有限公司网站

Linly-Talker支持自定义表情库,打造独特人设 在虚拟主播24小时不间断带货、AI客服秒回千条咨询的今天,一个数字人“像不像人”,早已不再只是看脸的事。真正让用户停留、信任甚至产生情感连接的,是那一下恰到好处的微笑、一丝因担忧…

张小明 2025/12/23 12:10:09 网站建设