设计函数:
1.能拆成函数的尽量拆成函数
2.函数设计时,尽可能考虑 健壮性,扩展性
函数调用的关系:
调用者
被调用者
int main(void)
{
printf("%d\n",getMonthDays());
return 0;
}
这个里面:
main ---成为调用者 ---main函数是整个程序的入口,只能是调用者
getMonthDays --- 在此处是 被调用者
getMonthDays()
{
isLeapYear();
} //函数的嵌套调用
main -->getMonthDays --> isLeapYear
注:
函数不支持 嵌套定义,但是可以嵌套调用
函数名 --- 函数的入口地址
函数调用的本质:
实际是利用的栈的结构 ---先进后出 --保证了函数可以层层嵌套调用
栈:
数据结构 --- (表示数组组织形式)
特点:
先进后出 (First In Last Out) //FILO
c语言角度的栈:
1.本质上是一块内存空间
2.只是按照 栈 这种数据结构 来处理和使用的
栈:
局部变量 //空间 自动申请 自动释放
C语言程序:
把内存划分了5个区域
栈 //主要 用来存放, 自动变量 或 函数调用的数据
堆 //空间大 堆上的空间 ,手动申请,手动释放
字符串常量区 // "hello" (只读)
静态区(全局区) // 全局变量 和 静态变量
代码区 // 只读的
程序 = 代码 + 数据
特殊嵌套调用 --- 递归 :
递归:
自己调用自己 //
直接递归
间接递归
类似循环 --- 递归是一种特殊的循环
1+2+...+100
sum = sum + 1;
sum = sum + 2;
sum = sum + ...
sum = sum + 100
int sum = 0;
int i = 0;
for (i = 1; i <=100; ++i)
{
sum = sum + i;
}
sum(100) //如果要求sum(100)的值,先求出sum(99)+100
|--sum(99) + 100 //如果要求出sum(99)+100,先求出sum(98)+99
|--sum(98)+99
|--sum(97)+98
... // ...
|--sum(3)+4
|--sum(2)+3
|--sum(1) + 2 //要求出sum(1)+2的值 只要求 1的值
1
递归思路:
要求问题n
依赖于问题n-1的解决
递归代码实现思路:
1.递推关系
怎么从 问题 n 到 问题n-1
sum(100) => sum(99)+100
sum(99) => sum(98)+99
sum(n) = sum(n-1)+n;
2.递推结束条件
n = 1
3.写代码
数组作为函数参数
//1.数组元素作为函数参数
//2.数组本身作为函数参数
int a[10] = {1,2,3};
int add(int a,int b)
{
return a + b;
}
add(a[0],a[1]); //函数元素
总结:
1. 一维整型数组 做函数 参数
形参 --写成数组形式 还需要 数组长度
实参 --数组名,数组长度
eg:
printArrray(int a[],int len) //形参
//printArrray (int *a,int len) ---编译器最终理解的形式
//调用
printArray(a,len);
int a[10];
数组名 代表类型 ---int[10] 这种数组类型
数组名 代表的值 ---首元素的地址 //(数组所占内存空间的首地址)