首先我们先来复习一下之前学过的函数的基础知识。在简单函数中,我们已经学习了函数的声明和定义,学习了函数的参数、实参、形参、参数的设计,函数的使用等一些知识。
函数的调用过程(栈帧)
现在我们来深入的研究一下函数的调用过程。
先来看一段代码:
#include <stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int ret = Add(a, b);
printf("ret = %d\n", ret);
return 0
}
这时我们来对代码进行调试,调用堆栈,可看出:
我们知道每一次函数调用都是一个过程。这个过程通常称之为:函数的调用过程。
这个过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存、现场保护。这块栈空间我们称之为函数栈帧。
而栈帧的维护我们必须了解ebp和esp两个寄存器。在函数调用的过程中这两个寄存器存放了维护这个栈的栈底和栈顶指针。
函数递归
什么是递归?
程序调用自身的编程技巧称为递归。
地柜作为一种算法在程序设计中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题简单化,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。
主要思考方式在于:大事化小
递归的两个必要条件
1、存在限制条件,当满嘴这个条件限制的时候,递归便不再继续。
2、每次递归调用之后越来越接近这个限制条件。
练习1:接受一个整型值(无符号),把它转换为字符并打印它。
例如输入1234,输出1 2 3 4
#include <stdio.h>
void print(int n)
{
if (n>9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}