数组作为函数参数为什么要多传一个长度_Day10
数组作为函数参数为什么要多传一个长度——Day10 学习记录从数组传参到日历打印学完函数之后我开始用函数封装各种功能。但很快就遇到了问题——把数组传给函数后用sizeof计算长度结果根本不是数组的大小。后来才知道这是 C 语言最经典的数组退化为指针规则。今天就把数组传参、字符串操作函数、作用域和存储类别串起来讲一遍最后用一个打印日历的例子收尾。① 数组传参的本质为什么不是传整个数组很多新手包括我第一次写数组传参时都会这么想“把整个数组传进去不就行了”但 C 语言偏不。它不传整个数组只传首元素的地址。原因数组可能很大。如果每次传参都复制整个数组性能开销太大了。C 语言的设计哲学是相信程序员不做多余的事。所以数组名做参数时编译器把它解释为指针——准确地说是退化为首元素地址。既然函数拿到的只是一个地址它当然不知道数组有多长。这就是为什么必须额外传一个长度参数。与之对比字符数组字符串不需要传长度因为字符串自带\0结束标志。函数只需一直读到\0就知道到哪结束了。一句总结数组传参退化为指针函数拿不到数组大小所以要么额外传长度要么靠 ‘\0’ 结尾。② 一维数组传参怎么写错误示例voidprintArray(inta[]){intlensizeof(a)/sizeof(a[0]);// 错sizeof(a) 是指针大小}这个坑我踩过不止一次。sizeof(a)在函数里返回的是指针的字节数8 或 4不是数组的大小。正确写法voidprintArray(inta[],intlen){for(inti0;ilen;i)printf(%d ,a[i]);}printArray(a,10);// 调用时传入长度字符数组就不一样了voidprintStr(chars[]){for(inti0;s[i]!\0;i)printf(%c,s[i]);}printStr(hello);// 不需要传长度一句总结整型数组传参要加长度参数字符数组靠 ‘\0’ 结尾。③ 二维数组传参为什么列数不能省略错误示例voidoutputArray(inta[][],introw);// 编译错误为什么错二维数组本质上是数组的数组。访问a[i][j]时编译器需要计算偏移量地址 首地址 (i * 列数 j) * 元素大小列数不指定这个公式就没法算。行数可以省略因为编译器不需要行数就能算出地址。正确写法voidoutputArray(inta[][4],introw){for(inti0;irow;i){for(intj0;j4;j)printf(%d ,a[i][j]);printf(\n);}}二维字符数组同理char str[][10]列数必须写行数可以省略。一句总结二维数组传参必须指定列数因为编译器需要列数来定位元素。④ 字符串操作函数自己动手实现标准库提供了string.h但自己实现一遍能更深刻理解原理。Strlen计算字符串长度遇到\0就停统计\0之前的字符数。intmyStrlen(constchars[]){inti0;while(s[i]!\0)i;returni;}Strcpy复制字符串注意要把\0也复制过去。voidmyStrcpy(chardest[],constcharsrc[]){inti0;while(src[i]!\0){dest[i]src[i];i;}dest[i]\0;// 别忘了复制结束符}Strcat拼接字符串先找到 dest 的末尾\0的位置再从那里开始复制 src。voidmyStrcat(chardest[],constcharsrc[]){inti0,j0;while(dest[i]!\0)i;// 找到 dest 末尾while(src[j]!\0){dest[i]src[j];i;j;}dest[i]\0;}Strcmp比较字符串逐个字符比较 ASCII 码找到第一个不同的字符就返回差值。intmyStrcmp(constchars1[],constchars2[]){inti0;while(s1[i]!\0s2[i]!\0){if(s1[i]!s2[i])returns1[i]-s2[i];i;}returns1[i]-s2[i];}一句总结四个操作函数的本质都是遍历 ‘\0’ 结尾的字符数组。⑤ 作用域与存储类别作用域讲的是在哪能用生命周期讲的是啥时候销毁。局部变量 vs 全局变量intg10;// 全局变量所有函数都能用voidfunc(){inta5;// 局部变量只能在 func 里用}就近原则如果局部和全局同名局部优先。存储类别关键字关键字存储位置生命周期作用域说明auto栈块内块内默认局部变量static全局区程序始终块内只初始化一次register寄存器建议块内块内编译器可忽略extern外部存储程序始终全局声明外部变量static最常用——它让局部变量在函数多次调用之间保持值不变但其他函数又访问不到。一句总结作用域决定可见性static 让局部变量拥有全局生命周期但保持局部访问限制。⑥ 综合实战打印日历今天最后一个实战打印 2026 年 7 月的日历。拆成四个函数每个只做一件事#includestdio.hintisLeapYear(intyear){return(year%40year%100!0)||(year%4000);}intgetMonthDays(intyear,intmonth){intdays[]{31,28,31,30,31,30,31,31,30,31,30,31};if(month2isLeapYear(year))return29;returndays[month-1];}intgetAllDays(intyear,intmonth){inttotal0;for(inty1;yyear;y)totalisLeapYear(y)?366:365;for(intm1;mmonth;m)totalgetMonthDays(year,m);returntotal;}voidprintCal(intyear,intmonth){intdaysgetMonthDays(year,month);intweekday(getAllDays(year,month)1)%7;// 2026.1.1 是周四printf( %d 年 %d 月\n,year,month);printf(日 一 二 三 四 五 六\n);for(inti0;iweekday;i)printf( );for(intd1;ddays;d){printf(%2d ,d);if((weekdayd)%70)printf(\n);}printf(\n);}intmain(){printCal(2026,7);return0;}核心思路从公元 1 年 1 月 1 日到目标年月的 1 日算出总天数总天数 % 7 得到星期几再按格式输出。每日一练运行上面的代码验证 2026 年 7 月的日历是否正确。你可以把年份和月份改成其他值测试。今日避坑指南坑原因怎么避函数内 sizeof(a) 不是数组大小数组名退化为指针额外传 len二维数组列数省略导致编译错误编译器无法计算偏移形参写int a[][N]Strcpy 忘记复制 \0目标数组不是合法字符串循环结束后加dest[i]\0Strcat 目标空间不够拼接后越界确保 dest 容量足够全局变量滥用函数间耦合高、难调试能用传参就别用全局忘记闰年判断2 月天数算错isLeapYear 单独封装今日学习感悟今天最有价值的收获是理解了 C 语言数组传参退化为指针这条规则。以前写sizeof(a)在函数里算出指针大小时我只觉得莫名其妙。今天搞明白了背后的原因——性能优先的设计哲学一切都有道理。另一个收获是日历打印这个实战。把一个看起来复杂的问题拆成四个小函数每个函数独立测试最后组合起来。这个拆分思路在嵌入式开发中特别重要一个函数只做一件事做好一件事。Day10 学习记录明天继续。

相关新闻

windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(八)

windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(八)

电源策略更改对于电源管理,客户端驱动程序使用 NETPOWERSETTINGS 对象 ,例如其他类型的 NetAdapterCx 客户端驱动程序。为了在系统处于工作状态(S0)状态时支持设备闲置,驱动程序调用 WdfDeviceAssignS0IdleSettings 并…

2026/7/26 8:26:54阅读更多 →
DPO技术如何优化AIGC图像生成审美表现

DPO技术如何优化AIGC图像生成审美表现

1. 项目概述:DPO技术如何重塑AIGC审美维度最近在调试Stable Diffusion模型时发现一个有趣现象:同样的提示词,经过DPO(Direct Preference Optimization)调优后的模型产出图像,在构图和色彩协调性上明显优于传…

2026/7/26 8:26:54阅读更多 →
大语言模型集成前必问的6个关键问题:从业务场景到技术落地的系统评估

大语言模型集成前必问的6个关键问题:从业务场景到技术落地的系统评估

在技术团队考虑引入大语言模型(LLM)时,很多决策者容易被其强大的生成能力吸引,却忽略了前期评估的重要性。盲目集成LLM可能导致项目偏离实际需求、资源浪费甚至技术债堆积。本文基于多个落地案例,梳理出六个关键评估问…

2026/7/26 8:26:54阅读更多 →
GitHub界面汉化插件:3分钟让英文GitHub变中文,提升开发效率

GitHub界面汉化插件:3分钟让英文GitHub变中文,提升开发效率

GitHub界面汉化插件:3分钟让英文GitHub变中文,提升开发效率 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还…

2026/7/26 9:35:09阅读更多 →
Django毕设选题推荐:基于行为分析的学习资源精准推送平台 在线学习资源分发与个性化推荐系统【附源码、mysql、文档、调试+代码讲解+全bao等】

Django毕设选题推荐:基于行为分析的学习资源精准推送平台 在线学习资源分发与个性化推荐系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 9:35:09阅读更多 →
AI如何优化学术PPT制作:从痛点解析到实战技巧

AI如何优化学术PPT制作:从痛点解析到实战技巧

1. 学术PPT制作的痛点与破局之道凌晨三点的大学宿舍里,机械键盘的敲击声格外清脆。小李盯着屏幕上那个丑陋的饼状图,第17次调整着字体间距——这是他为毕业答辩准备的第三版PPT,距离提交截止还剩6小时。这个场景在每年毕业季都会在各大高校重…

2026/7/26 9:35:09阅读更多 →
冷链物流车门视觉检测系统设计与实现

冷链物流车门视觉检测系统设计与实现

1. 项目背景与核心需求冷链物流行业对温度控制有着严苛要求,而车门密封性直接影响车厢内温度稳定性。传统人工检查方式存在漏检、效率低等问题。我们开发的这套系统通过视觉检测技术自动判断车门闭合状态,当检测到车门未关严时实时触发声光报警&#xff…

2026/7/26 9:35:09阅读更多 →
数据库越来越慢,我却一直找不到原因——直到装上Postgres Exporter找到了原因

数据库越来越慢,我却一直找不到原因——直到装上Postgres Exporter找到了原因

前言 做 PostgreSQL 运维最头疼的事情是什么? 很多人会说是数据库崩溃、磁盘爆满或者连接池耗尽。但真正让人难受的,往往是另一种情况:数据库明明还能用,却越来越慢。 页面加载开始变长,接口响应时间逐渐增加&#…

2026/7/26 9:35:09阅读更多 →
RAG系统性能调优:从检索到生成的优化策略

RAG系统性能调优:从检索到生成的优化策略

1. RAG系统性能调优的必要性 在构建基于检索增强生成(RAG)的问答系统时,开发者常常会遇到两个典型问题:响应延迟高和生成答案质量不稳定。这两个问题直接影响用户体验和系统可用性。延迟问题通常表现为用户查询后需要等待数秒才能…

2026/7/26 9:33:08阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/25 19:03:04阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/25 19:03:04阅读更多 →