一、函数的嵌套调用
嵌套调用是指一个函数在其内部调用了另一个函数。
函数进行嵌套调用时要注意:
参数传递形式为:值传递(对形参的修改不会影响到实参)即无法在被调函数中修改主调函数。
函数有多个形参时,调用函数时参数传递的次序是自右向左
传参时不要对同一个变量进行自加自减操作,容易造成错误。
函数调用实际上是程序跳转到被调函数的位置执行被调函数后,再返回到主调函数。
二、递归调用
- 递归调用是特殊的嵌套调用,其中一个函数直接或间接地调用自身。
- 每次递归调用都会在栈上创建一个新的栈帧,直到达到递归的终止条件。
嵌套调用和递归调用的区别:
- 嵌套调用是一个函数调用另一个函数,而递归调用是一个函数调用自身。
- 递归调用通常需要一个基准条件来终止递归,以防止进入无限循环,而嵌套调用没有这样的要求。
在C语言中,函数调用过程依赖于栈来管理函数调用、局部变量、返回地址等。这是因为栈具有“后进先出”(LIFO)的特性,适合用于管理嵌套的函数调用。
栈用来保存局部变量和临时数据以及返回地址。
保护现场指的是在调用一个函数之前,保存当前函数的执行状态,以便在被调用函数执行完毕后能够正确地恢复并继续执行
恢复现场指的是在被调用函数执行完毕返回之后,恢复原来的执行状态,以便继续执行调用函数。
在函数调用过程中,保护现场和恢复现场是确保程序执行正确性的关键步骤。
linux下,栈区空间大约为8M左右。
栈区用来存储局部变量、函数参数和函数调用的返回地址。栈区是内存的一部分,它采用先进后出(LIFO, Last In First Out)方式管理内存。
堆区是内存中的一部分,用于动态分配内存。与栈区不同,堆区的内存分配和释放由程序员手动进行。
字符串常量区用来存储程序中的字符串常量。
静态区用来静态变量和静态数据,其值在程序运行过程中不会改变。
全局区用来存储全局变量,所有函数都可以访问全局变量。
代码区用来存储程序的机器码,也就是实际执行的指令,代码区在程序加载时被加载到内存中,其大小通常由程序的代码量决定。
- 栈区:用于存储局部变量、函数参数、返回地址等,由操作系统自动管理。
- 堆栈:一般指栈的数据结构,用于函数调用和局部变量管理。
- 堆区:用于动态内存分配,由程序员手动管理。
- 栈帧:栈区中的一个内存块,与单个函数调用相关,存储函数的参数、局部变量和返回地址。