数组作为函数参数为什么要多传一个长度_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/10/13 19:31:29 阅读更多 →
Windows文件关联机制与注册表操作详解

Windows文件关联机制与注册表操作详解

1. 文件关联的本质与系统机制在Windows操作系统中,文件关联(File Association)是一套将特定扩展名的文件与对应应用程序绑定的机制。这个看似简单的功能背后,其实涉及注册表、MIME类型、默认程序设置等多层系统架构。当我们双击一…

2026/10/9 22:04:37 阅读更多 →
国内首个 uv 全链路镜像上线:安装、Python 下载、包索引一站加速

国内首个 uv 全链路镜像上线:安装、Python 下载、包索引一站加速

uv 是 Astral 团队用 Rust 编写的超快 Python 包管理器,比 pip 快 10–100 倍,以一个工具替代 pip、pip-tools、pipx、poetry、pyenv、virtualenv 等一整套工具链。然而在国内,uv 的三大网络环节——安装包下载、Python 解释器安装、Astral 元…

2026/9/15 16:05:41 阅读更多 →

最新新闻

Agent任务规划与推理模式重构:从过度规划到高效执行

Agent任务规划与推理模式重构:从过度规划到高效执行

一个任务丢给 Agent,很多时候都会得到一份漂亮但没法落地的计划。我在调 Pi agent 的时候就撞上过这类问题:让它做稍微复杂一点的事,它要么把简单任务拆出十来个步骤,要么在执行中反复重新评估,迟迟不调用工具&#xf…

2026/10/14 7:52:44 阅读更多 →
Spring Boot + Spring AI 实现生产级Java个人Agent实践

Spring Boot + Spring AI 实现生产级Java个人Agent实践

做AI Agent这一年多,我最常被问的一句话是:Java能做Agent吗?问这个问题的人,基本都是后端团队的技术负责人,系统跑在Spring Boot上,团队没人愿意为了一两个智能体功能单独养一套Python服务。我的回答一直是…

2026/10/14 7:52:44 阅读更多 →
后门漏洞排查与防御:从netstat到系统加固的实用指南

后门漏洞排查与防御:从netstat到系统加固的实用指南

在新手群里混久了,发现一个很有意思的现象:一说"后门漏洞",大多数人第一反应是那些好莱坞电影里的黑客镜头——敲几行代码,屏幕绿光一闪,电脑就沦陷了。但实际上,我带过的几个刚入行的朋友&#…

2026/10/14 7:52:44 阅读更多 →
MATLAB信号处理高频函数实战:FFT、滤波器与频谱分析详解

MATLAB信号处理高频函数实战:FFT、滤波器与频谱分析详解

做信号处理这行,MATLAB里那几十个函数,真正每天抓在手里用的其实就那么十来个。这篇是这个系列的第三篇,我打算把平时处理振动、音频、生物电这类实测信号时用得最频繁的函数挨个过一遍,不按教科书目录念定义,只讲这些…

2026/10/14 7:52:44 阅读更多 →
基于Java与Spring AI的生产级Personal Agent构建实践

基于Java与Spring AI的生产级Personal Agent构建实践

做这个项目之前,我的任务清单其实是这样的:让 Java 技术栈在生产环境里跑起一个真正“能干活的” Personal Agent,而不是又一个只能聊天的 API 壳子。折腾了一个多月,总算是把 Spring Boot Spring AI 这套组合从模型接入、工具注…

2026/10/14 7:52:44 阅读更多 →
Java Lambda不只是语法糖:从字节码到序列化的工程实践

Java Lambda不只是语法糖:从字节码到序列化的工程实践

1. Lambda身后的字节码:语法糖背后的真实身份1.1 先说结论:Lambda不完全是"匿名内部类的简写"很多Java开发者对Lambda最早的认知,就是"可以用Lambda代替匿名内部类,代码更简洁"。这个说法在80%的日常场景下是…

2026/10/14 7:51:44 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →