函数从入门到进阶--知识点总结加代码实战 📅 2026/8/16 1:53:58 函数从入门到进阶很多初学C语言的朋友学到 函数 这一章都会卡壳看不懂形参实参、不知道返回值怎么用、分不清全局/局部变量、写代码只会堆main函数、代码杂乱冗余还容易报错。今天这篇博客不堆砌概念全程纯干货可直接运行的实战代码从零带你吃透C语言函数学完直接上手写模块化代码。一、先搞懂到底什么是函数1. 通俗理解函数就是封装好的一段可重复使用的代码块。类比生活洗衣机就是一个“函数”。输入衣服、洗衣液参数内部执行进水、洗涤、脱水函数内部逻辑输出干净的衣服返回值写代码时把重复用到的功能求和、判断奇偶、排序、计算最值封装成函数不用每次重复写代码大幅精简代码、减少bug。2. C语言函数两大核心优势代码复用写一次随处调用不用重复造轮子模块化编程功能拆分清晰代码易读、易改、易排查错误二、C语言函数完整语法必背1. 标准函数格式返回值类型 函数名(形参列表){// 函数主体实现具体功能return返回值;// 和返回值类型对应}2. 各部分详解新手最易混淆点返回值类型函数执行完返回的数据类型int、float、void、char函数名自定义命名遵循标识符规则字母/数字/下划线不能数字开头形参列表函数接收的参数相当于“变量占位符”可空void无返回值函数不需要写return3. 函数的3种分类实战常用无参无返回值简单打印类功能有参无返回值对传入数据做处理不返回结果有参有返回值核心常用处理数据并返回结果三、从零实战3类函数完整代码案例所有代码可直接复制编译运行适配Dev-C、VS、gcc所有编译环境。实战1无参无返回值函数适用场景固定提示、固定图案打印、无需传参和结果的功能。#includestdio.h// 自定义无参无返回值函数voidprintHello(){printf( C语言函数实战 \n);printf(干货满满零基础入门\n);}intmain(){// 直接调用函数printHello();printHello();// 可重复调用return0;}运行结果 C语言函数实战 干货满满零基础入门 C语言函数实战 干货满满零基础入门核心要点void无返回值括号无形参直接函数名()调用。实战2有参无返回值函数适用场景接收外部数据完成打印、判断、修改等操作无需返回结果。案例传入两个整数打印两数之和#includestdio.h// 有参无返回值函数形参a、bvoidgetSum(inta,intb){intsumab;printf(两数之和为%d\n,sum);}intmain(){intx10,y20;// 传入实参x、ygetSum(x,y);getSum(50,30);// 直接传常量也可以return0;}运行结果两数之和为30两数之和为80重点区分形参 vs 实参形参函数定义时括号内的变量int a, int b仅占位不分配实际内存实参调用函数时传入的变量/常量x、y、50、30是真实数据实战3有参有返回值函数项目核心这是最常用的函数类型接收参数处理后返回结果给主函数使用。案例1求两个数的最大值#includestdio.h// 有参有返回值接收两个int返回最大值intintgetMax(inta,intb){if(ab){returna;// 返回结果}else{returnb;}}intmain(){intnum1,num2;printf(请输入两个整数);scanf(%d %d,num1,num2);// 接收函数返回值intmaxgetMax(num1,num2);printf(最大值为%d\n,max);return0;}案例2进阶实战判断一个数是否为素数#includestdio.h#includemath.h// 素数判断函数是素数返回1不是返回0intisPrime(intn){// 小于2不是素数if(n2)return0;// 遍历判断是否能被整除for(inti2;isqrt(n);i){if(n%i0){return0;// 能被整除不是素数}}return1;// 是素数}intmain(){intnum;printf(请输入一个数字);scanf(%d,num);if(isPrime(num)){printf(%d 是素数\n,num);}else{printf(%d 不是素数\n,num);}return0;}四、新手必踩坑函数声明与调用规则1. 经典报错隐式声明函数C语言规则函数必须先声明/定义后调用。如果把自定义函数写在main函数后面直接调用会报错。定义在调用之后且未声明就会报错2. 两种解决方法必掌握方法一函数写在main函数之前适合小型代码方法二函数声明大型项目标准写法#includestdio.h// 函数声明只写头部分号结尾intgetSum(inta,intb);intmain(){printf(%d\n,getSum(10,20));return0;}// 函数定义写在后面intgetSum(inta,intb){returnab;}总结声明告诉编译器“有这个函数”定义是函数具体实现。五、核心重难点局部变量 全局变量90%出错的根源变量作用域搞不清楚。1. 局部变量定义在函数内部仅在当前函数有效函数结束立即销毁不同函数可以定义同名局部变量互不干扰2. 全局变量定义在所有函数外部整个程序所有函数都可以使用程序运行期间始终占用内存3. 对比实战代码#includestdio.hintnum100;// 全局变量voidtest(){intnum200;// 局部变量优先使用printf(函数内部num%d\n,num);}intmain(){printf(main全局num%d\n,num);test();return0;}运行结果main全局num100函数内部num200核心规则局部变量优先局部会屏蔽全局。六、高阶实战递归函数经典例题递归函数自己调用自己核心是「递推终止条件」常用于阶乘、斐波那契数列、遍历问题。实战递归求 n 的阶乘#includestdio.h// 递归求阶乘intfactorial(intn){// 终止条件if(n1||n0)return1;// 递归公式returnn*factorial(n-1);}intmain(){intn;printf(请输入阶乘数);scanf(%d,n);printf(%d的阶乘为%d\n,n,factorial(n));return0;}递归必备核心必须有终止条件否则无限递归、栈溢出报错七、函数实战总结无返回值用void有返回值必须对应类型return先声明/定义后调用杜绝隐式声明报错形参是占位符实参是真实数据数量、类型必须一一对应局部变量仅限当前函数全局变量全程序通用递归必须设置终止条件避免死递归项目开发优先用函数封装拒绝全部代码堆在main里八、实战练习巩固提升大家可以自己手写练习吃透函数核心封装函数求三个整数的最大值封装函数判断闰年递归实现斐波那契数列前n项输出封装函数实现数组求和、求平均值函数是C语言从“入门”到“进阶”的关键看懂概念没用动手敲代码、调试报错、独立封装功能才是真正学会。本篇所有案例均可直接运行建议大家逐行敲写修改参数测试效果彻底吃透函数逻辑