函数
1、函数的作用
实现某一具体功能
2、函数的定义( 实现函数的过程 )
返回值的类型标识符 函数名(形式参数) //函数头
{
函数体 //实现函数具体功能代码
返回结果 //return 返回结果
}
(1).类型标识符 (返回值的类型标识符)
(2).函数名 --- 一般和函数功能对应
(3).形式参数 --- 函数接收数据的入口
--- 不是一定要有,看函数功能的需要,没有的话可以不写,写的话一般写void
形参使用时:
a.个数相同
b.类型匹配
c.形参与实参匹配顺序
形参 与 实参匹配顺序 -- 在ubunt18.04平台上 顺序是 从 右向左
形参eg:
(4).函数体 --- 完成函数具体功能的代码
(5).返回值类型
返回值 如果没有,返回值类型 一般写成void
返回的结果的类型 与 定义返回值类型 不一致 ,以定义的返回值类型为准
返回值的类型如果不写,默认为int型
3、函数定义的位置
(1) main函数之前不需要声明
(2) main函数之后需要声明
函数的声明:函数头 + 分号
函数声明可以放的位置:函数调用之前
4、函数调用的形式
(1) add(a,b); // 函数调用语句
(2) int ret = add(a,b); //函数调用在表达式中
(3) ret = add(a,b) + 3; //表达式的一部分
(4) printf("sum = %d\n",add(a,b)); //函数调用作为某个函数的实际参数
5、函数调用的本质
栈:
特点:
先进后出 (FILO)
inux系统上 ,默认情况下 8M ,大小可以调整。
主要:
局部变量
自动申请 自动释放
堆:
特点:
大
手动申请,手动释放
字符串常量区:
char s[10] = "hello";
全局区(静态区)
全局变量(静态变量)
代码区
内存的5个区
特殊的嵌套调用 --- 递归 (自己调用自己)
递归 --就是循环
直接递归
间接递归
while (1) //死循环
{
}
6、递归:
1.
2.算法
递归的思路,实现代码?
eg:
1+...+100
int i = 0;
int sum = 0;
while (i <= 100)
{
sum += i;
}
//1.初始条件
//2.结束条件
//3.趋于结束的操作
//4.循环体
//sum()
递归来实现: //倒着来
sum(100)
|--sum(99)+100
|--sum(98)+99
|--sum(97)+98
...
|--sum(2)+3
|--sum(1)+2
|--1
写出代码:
1.递推关系 //重复的
第n项 与 第n-1项之间的关系
2.结束条件
sum(100) = sum(99)+100
sum(99) = sum(98) + 99
sum(n) = sum(n-1) + n; //
sum(2) = sum(1)+2
sum(1) = 1
sum(2)
sum(n) =
int sum(int n) //n = 2
{
if 递归是否结束? (n==1)
{ //结束
return 1;
}else //
{
return sum(n-1)+n;
}
}
//递归函数内部的逻辑:
1.看是否递归结束了?
如果结束,返回结束时的值
2.如果没结束
递归继续往下
练习:
1.n的阶乘