首页/新闻资讯/正文详情

C语言函数核心精讲

发布时间:2026/9/24 4:24:23 来源:云帆数科 栏目:资讯中心
C语言函数核心精讲
C 语言函数核心课堂笔记从模块化设计到递归实战1. 核心思想自上而下逐步拆解编程的核心在于将复杂的大问题拆解为独立的小功能模块。以 ATM 机为例整体流程可拆解为插卡、验证、主界面、存钱、取钱等独立环节每个环节对应一个独立的函数 。步骤业务逻辑对应函数思维需求分析插卡 - 输密码 - 主界面 - 存钱/取钱将大流程拆分为小功能点功能映射存钱窗口、数钱验钞、确认交易每个小功能对应一个function实现策略独立开发、测试、组装模块化编程提高可维护性函数定义的本质一个函数完成一个独立单一的功能输入—处理—输出。C 标准库中的printf、scanf、strcpy等均遵循此模型 。2. 函数语法与定义规范2.1 标准语法结构// 类型标识符返回值类型不能是数组 // 函数名见名知意符合标识符规则 // 形式参数必须单独声明类型严禁简写 int a,b 类型标识符 函数名 (形式参数列表) { // 函数体声明部分 语句部分 局部变量声明; 执行语句; return 返回值; // 返回值类型需与定义一致 }2.2 实战示例两数求和#include stdio.h /** * 功能计算两个整数的和 * 参数int a, int b (形参必须单独写类型) * 返回int 类型的结果 */ int sum(int a, int b) { int result; // 局部变量存储在栈区 result a b; // 处理逻辑 return result; // 返回结果}注意每个形参变量必须显式指定数据类型不可像变量定义那样简写为int a, b这是 C 语法的强制要求 。2.3 实战示例求最大值int max(int a, int b) { int ret 0; if (a b) { ret a; } else { ret b; } return ret; }3. 函数调用机制3.1 三种调用方式函数调用语句独立执行不接收返回值。printMenu(); // 常用于打印界面等操作 2. **函数调用表达式**接收返回值参与运算或赋值。 c int s sum(3, 5); // s 8作为其他函数的实参嵌套调用。printf(%d, max(10, 20)); // 直接将 max 的结果传给 printf3.2 关键注意事项实参与形参匹配个数相同、类型匹配、一一对应。数据传递是单向的值传递形参的改变不会影响实参 。返回值类型若省略返回类型旧标准默认为int但现代编程严禁省略必须显式声明。若return表达式类型与函数定义不一致以函数定义的返回类型为准发生隐式转换。定义与声明顺序定义在main之前无需额外声明编译时已知晓函数存在。定义在main之后必须在调用前进行函数声明复制函数头末尾加分号。3.3 特殊函数无参无返// void 表示无返回值形参列表写 void 表示无参数 void printMenu(void) { printf(----MP3 Player----- ); printf(1. Play ); printf(2. Next ); // void 函数可省略 return若写 return 则不能带数值 return; }4. 内存布局与函数栈帧程序运行时的内存分布决定了变量的生命周期和作用域内存区域存放内容管理方式特点栈 (Stack)局部变量、函数参数自动申请/释放先进后出 (FILO)Linux 默认 8M溢出导致段错误堆 (Heap)动态分配内存手动malloc/free空间大需防止内存泄漏全局/静态区全局变量、static变量程序结束释放生命周期贯穿整个程序运行期字符串常量区字面量字符串 (如hello)只读尝试修改会导致崩溃代码区编译后的机器指令只读存放程序逻辑原理函数调用时系统会在栈区为该函数分配一块内存栈帧用于存放形参和局部变量。函数执行完毕栈帧自动弹出变量随之销毁 。5. 递归算法详解递归是函数自己调用自己的特殊嵌套调用本质是用栈空间换取逻辑的简洁性。5.1 递归两要素递推关系找到 $f(n)$ 与 $f(n-1)$ 的数学关系。出口条件必须有明确的终止条件否则导致栈溢出 (Stack Overflow)。5.2 经典案例代码案例 A1 到 n 累加公式$sum(n) sum(n-1) n$出口$n1$ 时返回 1。int sum_recursive(int n) { if (n 1) { return 1; // 递归出口 } else { return sum_recursive(n - 1) n; // 递推 } }案例 Bn 的阶乘公式$fact(n) fact(n-1) \times n$出口$fact(1)1$ 。long long factorial(int n) { if (n 1) { return 1; } return factorial(n - 1) * n; }案例 C斐波那契数列数列1, 1, 2, 3, 5, 8...公式$fibo(n) fibo(n-1) fibo(n-2)$。int fibo(int n) { if (n 1 || n 2) { return 1; // 前两项均为 1 } return fibo(n - 1) fibo(n - 2); }警告虽然递归逻辑简单但效率通常低于for/while循环且深度过大会耗尽栈空间。6. 课堂综合练习方案练习 1素数判断与双胞胎素数需求封装isPrime找出 0-100 内的双胞胎素数差值为 2的两个素数如 3 和 5。#include stdio.h #include math.h // 判断素数是返回 1否返回 0 int isPrime(int num) { if (num 1) return 0; // 只需遍历到 sqrt(num) for (int i 2; i sqrt(num); i) { if (num % i 0) { return 0; // 能被整除非素数 } } return 1; // 是素数 } int main() { printf(0-100 内的双胞胎素数: ); for (int i 2; i 98; i) { // 当前 i 是素数 且 i2 也是素数 if (isPrime(i) isPrime(i 2)) { printf((%d, %d) , i, i 2); } } return 0; }练习 2闰年与月份天数需求封装闰年判断进而获取某年某月的天数。// 判断闰年是返回 1否返回 0 // 规则(能被 4 整除且不能被 100 整除) 或 (能被 400 整除) int isLeapYear(int year) { if ((year % 4 0 year % 100 ! 0) || (year % 400 0)) { return 1; } return 0; } // 获取某年某月的天数 int getDaysMonth(int year, int month) { int days 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days 31; break; case 4: case 6: case 9: case 11: days 30; break; case 2: // 调用闰年函数决定 28 或 29 days isLeapYear(year) ? 29 : 28; break; default: days -1; // 错误月份 break; } return days; }练习 3最大公约数与最小公倍数思路利用辗转相除法求最大公约数 (GCD)最小公倍数 (LCM) (a*b)/GCD。// 求最大公约数 (辗转相除法) int gcd(int a, int b) { int temp; while (b ! 0) { temp a % b; a b; b temp; } return a; } // 求最小公倍数 int lcm(int a, int b) { if (a 0 || b 0) return 0; // 先乘后除可能溢出建议写法(a / gcd(a,b)) * b return (a / gcd(a, b)) * b; }参考来源C语言形参和实参的区别非常详细C语言函数的形参和实参C语言形参和实参的区别非常详细函数调用下形参和实参的内存分配编一个函数求n的阶乘使用for语句和while语句求n的阶乘关于简单阶乘的求和C

相关推荐

海康固定式扫码枪TCP通信实战指南
海康固定式扫码枪TCP通信实战指南

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

Windows镜像补丁集成:KB5043080四层注入与DISM精密操作指南
Windows镜像补丁集成:KB5043080四层注入与DISM精密操作指南

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

USB转串口线选型与调试避坑指南:从芯片方案到驱动安装
USB转串口线选型与调试避坑指南:从芯片方案到驱动安装

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

一读就懂!B端响应式设计的新手扫盲
一读就懂!B端响应式设计的新手扫盲

兰亭妙微UI设计公司:最近重新更新一下 B 端响应式相关的内容,帮助已经初步掌握的同学重新巩固,还没学会的同学快速入门。 响应式的适配对象 响应式是一种网页前端技术,让网页可以根据分辨率、设备的变更,自动调整样式… · 2026/9/24 5:15:28

学生宿舍楼综合布线实战设计:952个信息点全链路交付指南
学生宿舍楼综合布线实战设计:952个信息点全链路交付指南

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

FormConsumer 表单响应消费者:Vue 3 / Vue 2 下的响应式 UI 订阅组件
FormConsumer 表单响应消费者:Vue 3 / Vue 2 下的响应式 UI 订阅组件

前端UI组件 【免费下载链接】formily 📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 5:15:21

OpenLayers v3.16.0 版本解析:核心新特性、升级要点与源码实现解读
OpenLayers v3.16.0 版本解析:核心新特性、升级要点与源码实现解读

前端GIS数据可视化 【免费下载链接】openlayers OpenLayers 项目地址: https://gitcode.com/gh_mirrors/op/openlayers 点击查看 免费下载 本文以 OpenLayers 仓库中的 changelog/v3.16.0.md 为主体,结合仓库源码对 v3.16.0 引入的新 API、行为变更与升… · 2026/9/24 5:15:09

Android 一套代码扛几十种坐标系?投影类型到 proj 字符串翻译
Android 一套代码扛几十种坐标系?投影类型到 proj 字符串翻译

业务层面向对象,底层引擎只认 proj 字符串。中间类型映射表,藏着不少反直觉的坑。前言 做坐标转换功能的工程师,大概率都遇到过这种割裂:业务层想要"面向对象"——一个坐标系就是一个对象,里面有椭球、投影类… · 2026/9/24 5:15:09

SemIf 的 Apple Silicon 原生 MLX 后端:安装、量化、缓存复用与证据复现实战指南
SemIf 的 Apple Silicon 原生 MLX 后端:安装、量化、缓存复用与证据复现实战指南

【免费下载链接】SemIf-OpenJev Semantic ifs from open models, on a 3090 at home. Independent; not affiliated with Jev or TypeSafe. 项目地址: https://gitcode.com/gh_mirrors/op/SemIf-OpenJev 点击查看 免费下载 SemIf(语义决策开源基线&… · 2026/9/24 5:15:03

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码