C 语言函数精通:递归与内联函数实战案例详解
什么是 C 语言函数?
C 语言函数 是可复用的代码块,让程序更易理解、测试,且无需修改调用者即可修改实现。函数将代码分割模块化,提升效果。简而言之,大程序分解为多个称为函数的子程序。

将大程序拆分为多个函数,便于单独管理。出错时可快速定位并修正故障函数。随时调用复用函数,自动节省时间与空间。
本教程学习内容:
- 库函数 vs 用户自定义函数
- 函数声明
- 函数定义
- 函数调用
- 函数参数
- 变量作用域
- 静态变量
- 递归函数
- 内联函数
库函数 vs 用户自定义函数
每个 C 程序至少有一个函数——main,但可包含任意数量函数。main() 是程序起点。
C 语言函数分两类:
- 库函数
- 用户自定义函数
区别:库函数无需编写代码,已存在于头文件中(程序开头 #include 引入)。直接按语法调用名字即可。printf、scanf 即库函数例。
用户自定义函数需自行编写函数体,在需要时调用执行特定操作。用户自定义函数虽由用户编写,但后续可成为 C 库一部分,这是 C 语言一大优势。
C 函数包含三个活动:
- 函数声明
- 函数定义
- 函数调用
函数声明
函数声明即写出函数名,是代码使用函数的强制环节。声明时仅指定函数名、返回类型、参数类型(参数名可选),类似变量声明。未声明不可使用。函数声明又称“函数原型”。
函数声明(原型)通常置于 main() 之前,通用形式:
return_data_type function_name (data_type arguments);
- return_data_type:函数返回值的数据类型
- function_name:函数名,后跟括号
- Arguments:括号内可选参数名及其类型声明
示例:声明计算立方的 cube 函数
#include <stdio.h>
/* 函数声明 */
int add(int a,b);
/* 声明结束 */
int main() {
注意:函数不一定返回值,此时用 void。如 void output_message(); 表示无返回值。
函数定义
函数定义即编写函数体。函数体由执行特定任务的语句组成,可以是单条或语句块。这是函数的强制部分。
int add(int a,int b) // 函数体
{
int c;
c=a+b;
return c;
}
函数调用
函数调用即在程序需要时调用函数。调用时函数执行其设计的操作。函数调用在程序中是可选的。
result = add(4,5);
完整代码:
#include <stdio.h>
int add(int a, int b); // 函数声明
int main() {
int a=10,b=20;
int c=add(10,20); // 函数调用
printf("Addition:%d\n",c);
getch();
}
int add(int a,int b) // 函数体
{
int c;
c=a+b;
return c;
}
输出:
Addition:30
函数参数
函数参数接收调用传递的值。按位置匹配:第一个实参对应第一个形参,以此类推。
默认 按值传递,即传递数据副本,被调函数修改不影响实参原变量。
演示按值传递:
int add (int x, int y);
int main() {
int a, b, result;
a = 5; b = 10;
result = add(a, b);
printf("%d + %d = %d\n", a, b, result);
return 0;
}
int add (int x, int y) {
x += y;
return(x);
}
输出:
5 + 10 = 15
注意:a、b 传入 add 的值未变,因为只将值传给形参 x。
变量作用域
变量作用域指变量在程序代码中的可见范围。
C 语言中,函数内声明的变量为局部变量,函数外不可引用。所有函数外声明的变量为全局变量,整个程序均可访问。程序顶部 #define 定义的常量全程序可见。下例从 main 与用户函数均打印全局变量:
#include <stdio.h>
int global = 1348;
void test();
int main() {
printf("from the main function : global =%d \n", global);
test () ;
return 0;
}
void test (){
printf("from user defined function : global =%d \n", global);
}
结果:
from the main function : global =1348 from user defined function : global =1348
程序细节:

- 声明全局整型变量 global=1348
- 声明并定义 test() 无参无返回,仅打印 global 证明全局变量随处可访问
- main 中打印 global
- 调用 test 打印 global
C 语言中,实参传给形参时,形参作为局部变量,函数退出即销毁。
使用全局变量需谨慎,因可在程序任意处被修改,易引发错误。使用前应初始化。
静态变量
静态变量具有局部作用域,但函数退出时不销毁。因此静态变量永久保持值,函数重入时仍可访问。声明时需初始化并加 static 前缀。
使用静态变量的程序:
#include <stdio.h>
void say_hi();
int main() {
int i;
for (i = 0; i < 5; i++) {
say_hi();
}
return 0;
}
void say_hi() {
static int calls_number = 1;
printf("Hi number %d\n", calls_number);
calls_number ++;
}
程序显示:
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
递归函数
以阶乘为例:6! = 6×5×4×3×2×1。反复计算 fact × (fact-1) 直到 fact=1。
递归函数自我调用并包含退出条件以结束递归。阶乘的退出条件是 fact=1。递归通过“压栈”调用直到基准条件满足。
示例:
#include <stdio.h>
int factorial(int number);
int main() {
int x = 6;
printf("The factorial of %d is %d\n", x, factorial(x));
return 0;
}
int factorial(int number) {
if (number == 1) return (1); /* 退出条件 */
else return (number * factorial(number - 1));
}
程序显示:
The factorial of 6 is 720
程序细节:

- 声明递归 factorial 函数,接受整型参数返回阶乘。函数自我调用并递减参数直到基准条件。条件满足时,前序调用返回值相乘,最终得到阶乘。
- 声明并初始化整型变量 x=6,调用 factorial 打印结果。
参考下图理解递归机制:调用自身直到基准情况,随后收集前序值:

内联函数
C 语言函数用于存放高频指令,模块化程序。调用函数时指令指针跳转到函数定义,执行完返回跳转点。这需要额外指针开销。内联函数将调用直接替换为实际代码,无跳转开销,所有操作在内联函数内完成。
内联函数适合小计算,不适合大量计算。语法:在函数名前加 inline 关键字。
inline function_name () { // function definition }
实现内联加法函数:
inline int add(int a, int b) // 内联函数声明
{
return(a+b);
}
int main() {
int c=add(10,20);
printf("Addition:%d\n",c);
getch();
}
输出:
Addition: 30
程序演示内联函数加法:直接在内联函数内返回相加结果,调用时仅传值无额外代码。
总结
- 函数是小程序或子程序
- 函数用于模块化程序
- 库函数与用户自定义函数两类
- 函数包含声明、函数体、调用三部分
- 声明与函数体强制,调用可选
- C 程序至少有一个函数:main()
- 每个函数有名称、返回类型或 void、参数
- 每个函数必须在 C 程序中定义并声明
- 普通 C 函数局部变量随函数调用结束即销毁
- 实参按值传递,非按地址,故不被修改
- 变量作用域指变量在程序中的可见性
- C 语言有全局与局部变量
C语言
- C++数组传递给函数实战指南
- C 语言用户自定义函数四大模式对比:参数与返回值的设计权衡
- C++ do-while 循环详解:语法、实战示例与嵌套循环
- C++ 运算符重载实战指南:语法、方法、限制与代码示例
- C++ 函数详解:从声明到调用的实战指南
- C 语言 calloc() 详解:零初始化动态分配原理与实战案例
- C 语言函数详解:定义、声明、调用与参数传递
- 掌握Verilog函数:高效RTL设计的复用利器
- MATLAB 函数详解:定义、工作区、输入输出与多种函数类型
- 精通 Python Lambda 函数:实用示例与最佳实践
- Python round() 函数详解与实战示例
- 精通 Python map() 函数:语法、示例与最佳实践