Days 9 函数初学 一、为什么要学函数刚学 C 语言的时候所有代码全堆在main里写重复功能要复制粘贴一大段代码又乱又难改。函数就是用来解决这个问题的 函数两大好处代码复用同一个功能只写一次想用直接调用不用反复复制代码模块化拆分把复杂程序拆成一个个独立小功能逻辑清晰找 bug、改代码都很方便。整个 C 程序必须有且只有一个main函数程序从main开始执行其他都是我们自己写的自定义函数。二、函数完整三要素定义、调用、声明1. 函数定义写函数本体实现功能标准语法拆解每一部分返回值类型函数执行完给外面返回的数据类型没有返回值写void不用写return函数名命名规则和变量一样只能字母、数字、下划线不能数字开头尽量见名知意比如is_leap_year判断闰年形参形式参数函数接收外部数据的 “占位符”只有调用函数时才会分配内存函数结束直接销毁函数体{}写具体逻辑return结束函数把结果传给调用处void函数可以省略 return。举个简单例子判断闰年函数2. 函数调用使用写好的函数语法函数名(实参1, 实参2);实参实际参数调用时真实传进去的数据可以是常量、变量、表达式规则实参的个数、顺序、数据类型必须和形参完全对应C 语言只有值传递只是把实参的值拷贝一份给形参函数内部修改形参完全不会影响外面的实参。调用上面闰年函数这里main是主调函数is_leap_year是被调函数。3. 函数声明函数原型解决编译报错C 语言代码从上往下逐行编译如果函数定义写在 main 函数下方编译器读到调用代码时找不到函数直接报错。 解决办法在 main 上方提前声明函数告诉编译器这个函数存在。声明格式去掉函数体末尾加分号完整带声明示例小总结定义在 main 上方不用声明定义在 main 下方必须提前声明。三、变量的作用域 生命周期函数配套重点1. 局部变量定义在函数内部、大括号{}里的变量就是局部变量作用域只能在当前大括号内使用外面访问不到存储位置栈区生命周期进入代码块分配内存执行完大括号直接销毁默认存储类型auto可以省略不写未初始化值是随机垃圾值一定要手动初始化。2. 全局变量定义在所有函数外面的变量作用域整个.c文件所有函数都能访问存储位置静态数据区生命周期程序运行全程存在程序结束才销毁未初始化默认自动赋值 0缺点所有函数都能修改容易乱改数据尽量少用。四、四种变量存储类型存储位置 / 特性1. auto自动变量局部默认仅局部变量可用存栈区函数结束内存释放不初始化 随机值。2. register寄存器变量局部变量专用优先存 CPU 寄存器读取更快寄存器满了自动降级为 auto 栈变量不能取地址。3. static静态变量分两种1static 修饰局部变量原本局部变量存栈static 后放到静态数据区生命周期第一次调用函数时初始化一次之后函数调用不会重新初始化程序结束才销毁作用域不变还是只能当前函数内使用不初始化默认 0适合计数场景。示例统计函数调用次数2static 修饰全局变量 / 函数限制作用域只能在当前.c文件使用其他文件无法访问避免多文件命名冲突。4. extern外部声明只用来声明变量 / 函数不分配内存告诉编译器这个变量 / 函数定义在别的文件或文件下方。五、函数传参核心值传递C 语言所有函数传参都是单向值传递调用函数时把实参的值复制一份给形参实参、形参是两块独立内存互不干扰在函数内部修改形参外部实参完全不会变化。错误示例交换两个数字失败原因只是拷贝了 a、b 的值给 x、y函数内交换的只是副本本体没变。六、课堂作业实战封装函数练习作业 1封装函数传入年月日返回当年第几天思路封装闰年判断函数is_leap_year封装get_dayofyear(int y,int m,int d)累加前面月份总天数加上当日二月天数根据闰年判断是 28/29 天。作业 2字符串倒置函数封装不使用库函数七、新手踩坑总结函数定义在 main 下方忘记写函数声明编译报错return 返回值和函数定义的返回类型不一致会隐式转换丢失数据局部变量不初始化直接使用读取随机垃圾值static 局部变量误以为每次调用都会重新初始化传参误以为修改形参能改变实参不清楚 C 语言只有值传递函数名和库函数重名比如 printf造成程序异常void 函数写 return 数字语法错误。八、学习感悟函数是 C 语言从 “简单代码” 进阶 “模块化程序” 的分水岭学会封装函数之后写复杂逻辑清晰很多。尤其是 static 静态局部变量、值传递这两个点一开始很难理解多写几次计数、交换的练习就能吃透。后续学指针之后还能解决 “值传递无法修改外部变量” 的问题继续加油

相关新闻

最新新闻

STM32F103时间同步实战:从NTP原理到嵌入式主从时钟校准

STM32F103时间同步实战:从NTP原理到嵌入式主从时钟校准

1. 项目概述与核心价值最近在做一个嵌入式设备集群的小项目,几个基于STM32F103的节点需要协同工作,结果发现每个板子跑着跑着,内部时钟就差出去好几秒,数据对不上,逻辑全乱套了。这让我不得不停下来,专门搞…

2026/7/30 7:25:27
基于DeepSeek与Cline构建AI游戏开发助手:从环境配置到高效提示词工程

基于DeepSeek与Cline构建AI游戏开发助手:从环境配置到高效提示词工程

1. 项目概述:为什么你需要一个专属的AI游戏开发助手? 如果你正在独立开发游戏,或者在一个小团队里身兼数职,那你一定对“时间不够用”和“创意卡壳”这两件事深有体会。美术资源、程序逻辑、玩法设计、数值平衡……每一项都像一座…

2026/7/30 7:25:27
对话式软件交互:NLP与LLM驱动的企业应用实践

对话式软件交互:NLP与LLM驱动的企业应用实践

1. 软件聊天机器人化的核心价值解析 当我们在2023年回顾人机交互的发展历程,会发现一个明显的趋势:传统图形界面(GUI)正在向对话式界面(CUI)演进。这种转变不是简单的交互形式变化,而是从根本上重构了软件的使用范式。以我参与过的某企业级ER…

2026/7/30 7:25:27
Android广播机制:静态与动态注册的深度解析与实战指南

Android广播机制:静态与动态注册的深度解析与实战指南

1. 项目概述:广播机制在Android开发中的基石地位 广播机制是Android系统四大组件之一,也是实现组件间通信、系统事件监听和跨进程消息传递的核心手段。无论是应用内一个模块通知另一个模块数据已更新,还是监听手机的电量变化、网络连接状态&…

2026/7/30 7:25:27
从BUUCTF RIP题入门栈溢出:原理、调试与ROP链基础

从BUUCTF RIP题入门栈溢出:原理、调试与ROP链基础

1. 从一道经典栈溢出题说起:为什么是RIP? 如果你刚开始接触二进制安全,尤其是PWN方向,那么BUUCTF上的这道名为“RIP”的题目,大概率是你的“新手村”任务。题目名字起得直白又巧妙——“RIP”,在x86-64架构…

2026/7/30 7:25:27
重拳整治生物医药检验造假之风,IACheck AI 报告审核构建全天候智能质控屏障

重拳整治生物医药检验造假之风,IACheck AI 报告审核构建全天候智能质控屏障

近些年,生物医药产业作为国民健康支柱产业,迎来了飞速发展期。创新药研发、医疗器械投产、体外诊断试剂量产、临床试验开展、药企出厂质量检测…… 整条产业链蓬勃扩张的背后,潜藏已久的检验报告造假、数据篡改、检测结果随意修订、原始记录与…

2026/7/30 7:20:27

月新闻