C语言---函数传参、栈、内存的区域划分、函数的递归调用、数组传参

目录

一、概念与定义

       (1) 回顾与补充

        (2) 函数传参

        (3) 栈

        (4) 程序运行时内存的区域划分

二、函数的递归调用

       (1) 概念

        (2) 例题

三、数组传参

        (1) 概念        

        (2) 例题


一、概念与定义

       (1) 回顾与补充

         assert(条件):若条件为假则为断言失败语句,后续代码不执行。

        函数的定义不可以嵌套,但函数的调用可以。

        提高函数的可读性是建立函数的目的之一。

        (2) 函数传参

        a. 值传递(无法在被调函数中改变主调函数的实参本身,可采用指针来实现被调函数中的形参改变);

        b. 函数参数默认说自右至左传递的。

        (3) 栈

        CPU与RAM的总线结构如下图:

        PC(Program Counter)程序计数器,本质是一个指针,指向当前指令(CPU运行到的地址)的下一行指令,称为CPU的三级流水线结构。

        函数的调用可视为指令的跳转,需要使用栈,函数的入口地址是函数的首地址,栈遵循“ 先进后出 ”原则,用来存放数据指令,入栈是装束数据的过程,出栈是取出数据的过程,栈的目的是“ 保护现场和恢复现场 ”,超出栈的空间(8兆)会产生越界访问,出现错误。

        (4) 程序运行时内存的区域划分

                a. 栈区:保护现场(返回地址、局部变量、形参) eg. char s[100]

                b. 堆区:须向操作系统申请空间,并在用完后归还空间,利用指针实现

                c. 字符串常量区:存放字符串常量,eg. “Hello”

                d. 代码区:不能改变,eg. 字符型常量 'A'

                e. 静态区(全局区)

二、函数的递归调用

       (1) 概念

        在调用一个函数的过程中又出现直接或间接地调用该函火速本身,成为函数的递归调用。函数直接调用与间接调用都是无终止的自身调用,示意图如下(第一张为直接,第二张为间接):

                                         

        C语言中允许函数的递归调用。例如:

 f 函数被循环调用,但内存空间是有限的(8兆),f 函数一直在自己调自己,一直在占新的空间,虽然不会出现死循环,但空间会被占满,导致运行结果无法显示。

        函数的递归调用是以消耗大量的内存空间来实现的,而在程序中,只应该出现有限次数的、有终止的递归调用,可以用 if 语句来控制,只有在某一条件成立时才继续执行递归调用。

        (2) 例题

eg1. 实现1到n的累计和(即 1+2+3+......+n的值)

上述代码中的“ if(1 == n) ”是循环终止的条件

eg2. 实现 n!

eg3. 汉诺塔的实现(即利用 n 根杆子实现将圆盘从第一根杆子移动到第三根杆子上,并且移动过程和结构都只能大盘在下,小盘在上)

eg4. 查找斐波拉契数列中第某项的数值(前两项和等于后一项的数列)

三、数组传参

        (1) 概念        

        数组作为函数参数,传递的是首元素的地址和元素个数,是一种单向传递,即 “值传送” 方式。其一般格式为: 类型说明符  函数名(数组类型  数组名[], 长度)。例如:sumOfTheArray(int a[], int len) ,其中 “ sumOfTheArray ”为函数名,“ a[] ”为数组,“ len ”为长度。

        数组传参时,是通过指针将实参地址传入被调函数,可以经被调函数将数据改变。

        (2) 例题

eg1. 数组求和

eg2. 一维数组的逆序与输出

eg3. 数组的三种排序方法

    

eg4. 利用二分查找法查找数组中是否有某个值

eg5. 数组的打印、有效长度、拷贝、拼接、比大小

  

  

eg6. 字符串转整型变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值