函数
描述某一功能模块的过程
1.定义函数
结果 函数名(形参列表)
{
return 表达式;//结果只能由return返回
}
例如:
//无参数无返回值
void fun1()
{...;}
//有参数无返回值
void fun2(形参列表)
{...;}
//有参数有返回值
返回值类型 fun3(形参列表)
{
...;
return 返回表达式;
}
2.调用函数
函数名(实参列表);
//函数名要匹配,形参与实参要匹配
//在调用函数时,遇到return则结束执行函数
3.变量的作用域与生存周期
作用域: 变量能被引用到的区间
局部变量 | 全局变量 | |
---|---|---|
定义 | 在函数内定义的变量 | 在函数外定义的变量 |
作用域 | 在函数内 | 在文件内 |
//在同一作用域下不能出现同名变量;引用变量时,局部变量优先
生存周期: 变量空间被分配开始到被分配空间结束
动态变量 | 静态变量 | |
---|---|---|
含义 | 当函数调用开始时分配,函数调用结束时释放空间 | 程序运行开始时分配空间,运行结束时释放空间 |
定义 | [auto] 类型 变量名; | static 类型 变量名; |
注 | 在函数内部定义变量没有声明动静态,默认是动态;形参也是动态变量 | 全局变量是静态变量 |
4.函数的递归调用
//自己调用自己
返回类型 函数名(形参列表)
{
函数名(形参列表);
}
函数递归是C语言函数这一块比较重要的知识点,要用好递归首先要明白:
- 从什么时候开始
- 什么时候结束
- 每次递归要干些什么
递归思想:从上往下逐条执行。当前指令没有执行完成,下一条指令不会执行
例如:
#include <stdio.h>
void fun(int i)
{
fun(i+1);
printf("%d\n",i);
}
int main()
{
fun(1);
return 0;
}
程序运行结果:
原因是main调用fun,fun中先调用fun在执行输出,所以无限的调用自己导致内存溢出,最后程序报错。
详细思路如图:
一个简单的递归应用实例:求前n项阶乘的和
#include <stdio.h>
int fun(int n) //定义一个返回值为int类型的函数
{
static int m=1,s=0; //定义静态变量
if(0==n) //结束递归条件
return s; //返回前n项和
fun(n-1);
m*=n,s+=m; //求前n项的阶乘,与前n项的和
}
int main()
{
int n;
printf("请输入一个数:");
scanf("%d",&n); //提示输入一个数
printf("%d\n",fun(n)); //调用函数并打印输出
return 0;
}
程序运行结果: