文章目录
- 函数调用:
- 函数调用关系:调用者与被调用者
- 调用的原理:
- 栈的具体介绍:
- c语言角度的栈:
- c语言将内存空间分为了5份:
- 调用的本质:
- 特殊的函数调用:递归
- 概念:自己调用自己。
- 形式:
- 使用思路:
- 数组作为函数参数的情况:
- 总结:
函数调用:
函数调用关系:调用者与被调用者
int GetMoonDays(void)
{
isleapyear(); //其中该函数运用到了函数的嵌套,即在函数之中调用函数
}
int main (void) //其中main是调用者,GetMoonDays()此处是被调用者,main是整个程序的入口,只能是调用者
{
printf("GetMoonDays()");
}
函数调用过程中保证返回时程序继续执行的关键:
程序计数器(Program Counter,PC)是计算机处理器的一个寄存器,它存储着当前正在执行的指令的地址。
pc-program counter 程序计数器 负责拿下一条执行的语句,给cpu执行。
作用:
保存现场:记录main执行到哪个位置,然后才去别的位置执行函数。
恢复现场:函数执行完回到main,找之前的记录然后恢复之前的进程。
调用的原理:
调用过程和栈息息相关。
入栈:调用别的函数时,就把现在执行主程序产生的数据放到栈里
出栈:调用的函数执行完毕之后,就把栈里的数据拿出来,继续主程序的执行。
原理语言化:
在这个过程中如果出现函数的嵌套,则放进栈里的数据就堆叠起来,先进栈的数据在栈低,后进的就在栈顶,函数返回的时候就一层一层从栈顶到栈底把数据拿出来,最后回到主函数,继续将主函数执行完。
栈的具体介绍:
栈也可以看作时一种数据结构,表示类似数组的组织形式。
特点:先进后出。
c语言角度的栈:
本质上是一块内存空间。
但是使用方式时按照上图栈的结构原理来运用的。
并且栈一般用于存放局部变量 //局部变量即其自动申请,自动释放的变量
c语言将内存空间分为了5份:
栈:主要是用来存放自动变量或函数调用之前的数据。(其中栈博人大小为8G但是可修改)
堆:空间大,堆上的空间,手动申请,手动释放。
字符串常量区域:存储字符串常量,只可读不可改。
***静态区:***存放全局变量和静态变量
代码区:只读
调用的本质:
实际上是利用栈的结构先进后出保证函数可以层层嵌套调用。
函数可以层层嵌套调用。
特殊的函数调用:递归
概念:自己调用自己。
形式:
直接调用:自身调用自身。
间接调用:两个函数互有彼此,然后不断调用对方函数。
类似与循环,然后不断调用对方函数。
使用思路:
处理要求问题n则要先处理n-1由此层层往前递归。
数组作为函数参数的情况:
数组元素作为函数参数
数组本身作为函数参数。
即将整个数组的地址给调用的函数。
总结:
一维整形数组做函数参数。
形参:写成数组形式,即 a[]
(括号内不写数的原因:其形参以该格式出现是用于表明数据类型,传的是地址,定义数组长度没用。)
实参:数组名,数组长度。
举例:
定义中
int Arrayprint(int a[],int len)
主函数中
Arrayprint(a,len);
编译器实际理解的形式
Arrayprint(int A*,int len);
Arrayprint(a,len);