尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

C语言函数核心精讲

发布时间:2026/9/24 4:24:26

资讯中心
01
ARTICLE

C语言函数核心精讲

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
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。