栈在函数和递归中起着至关重要的作用。一、函数调用中的栈1. 参数传递:当一个函数被调用时,调用者会将函数的参数压入栈中。这些参数按照特定的顺序存储,以便被调用函数能够正确获取。例如,在函数`add(int a, int b)`调用时,参数`a`和`b`会依次被压入栈。2. 局部变量存储:被调用函数内部定义的局部变量也存储在栈中。每一个函数调用都有自己独立的栈帧,局部变量在这个栈帧内分配空间。比如函数`void func()`中定义的局部变量`int num`,就在该函数的栈帧中占据一定的内存空间。3. 函数返回地址:调用函数时,系统会记录下调用该函数之后要执行的下一条指令的地址,并将其压入栈中。当函数执行完毕,通过这个返回地址,程序可以回到调用函数后的正确位置继续执行。二、递归中的栈1. 保存递归状态:在递归调用过程中,栈用于保存每一层递归的状态。每次递归调用都会创建一个新的栈帧,其中包含该层递归的参数、局部变量等信息。例如在计算阶乘的递归函数`int factorial(int n)`中,每一次递归调用时的`n`值以及局部变量等都在各自的栈帧中存储。2. 控制递归深度:栈的大小限制了递归的深度。如果递归层次过深,导致栈空间耗尽,就会引发栈溢出错误。比如在一个没有终止条件或者递归层次过多的递归函数中,就容易出现这种情况。3. 回溯:当递归函数开始返回时,栈帧会依次弹出,程序根据栈中保存的信息逐步回溯到上一层递归,最终回到最初的调用点。栈在函数调用和递归过程中通过合理地存储和管理各种信息,确保了程序的正确执行流程和状态的有效维护。