函数
看清函数的执行机制:作用域链、闭包捕获与递归终止条件
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
函数
看清函数的执行机制:作用域链、闭包捕获与递归终止条件
函数初识
上页留下的'函数'还是直觉印象,本页要收紧边界:什么关系算函数、什么只是相关?靠的是'每个输入只对应唯一输出'这条铁律。
投币(输入)必得唯一商品(输出),机器就是对应规则
函数的参数传递
上一节我们让函数跑起来了,但你有没有想过:调用 f(x) 时,那个 x 究竟是怎么进到函数里的?是把你传的东西复印了一份,还是只抄了个门牌号?
形参是新标签,实参是已存在物品;改物品内容两边都看见,重贴标签只动标签本身
函数嵌套调用
上一节我们搞清楚了参数是怎么传给函数的。但如果函数 A 自己处理不了全部事情,需要临时叫 B 来帮忙,结果再拿回来接着用——这就是嵌套调用。
主管(A)处理到一半请总监(B)审批,总监签完(A继续);主管的项目(A局部变量)总监看不见
函数递归调用
上一页函数里可以调用别的函数。如果一个函数调用的正是它自己,事情会变得既优雅又危险——这就是递归。
打开一层套一层,最里那个最小娃娃就是终止条件
全局变量和局部变量
递归调用讲过,函数会一层层嵌套执行。问题来了:不同函数里定义的变量,到底谁能看见谁?这就涉及变量的「地盘」——作用域。
公告栏谁都能看(全局),抽屉只有自己能开(局部);撞名时抽屉里的优先
变量的存储类型
上一节我们区分了全局变量和局部变量,知道了作用域的不同。但变量还有另一个维度——「能活多久」,也就是它的存储类型。
auto 临时住退房即走,static 长住到期才走,register VIP 优先,extern 别处的房产证
二级C考点解析之函数的定
上一节我们见过函数被调用——点菜让后厨做菜。但后厨这道'菜'是怎么写进菜单、又是怎么一步步做出来的?这就要拆解函数'定义'本身。
声明是贴出'此处将建楼'的告示,定义是真正动工砌出整栋楼
二级C考点解析之函数的嵌
函数的定义考点刚刚梳理完,现在轮到嵌套与递归。考场上这两类题看似简单,但命题人最爱在「定义 vs 调用」「递归终止条件」这些位置挖坑。
拆一层相当于一次递归调用入栈,套回去相当于 return 出栈
二级C考点解析之变量的完
前页我们学了 auto、static、register、extern 四种存储类型的作用。但把它们和数据类型、变量名组合起来,一行完整的变量定义到底由哪几部分组成?哪些细节是考试中最容易丢分的盲区?
租期类型=存储类型,户型=数据类型,门牌号=变量名,首月押金=初值
本节要点
- ✓C 的参数传递本质是值传递;传地址是模拟引用效果的唯一手段
- ✓递归需要递推式与终止条件同时成立,缺一就会栈溢出
- ✓存储类别决定生命周期,与作用域是两套独立维度
- ✓同名局部变量在不同函数中互不相干,各占独立栈帧
- ✓函数嵌套调用靠栈帧层层叠加,深层递归易引发栈溢出
课后思考
先合上书本独立思考,再对照参考答案检验思路。三道题分别对应回顾、应用与拓展。
参考答案会。每次递归调用都会在栈上开辟新的栈帧,参数和局部变量是该栈帧的私有副本。递归返回时栈帧销毁,变量随之释放。
参考答案可以把状态作为函数参数显式传入(累加器模式),或封装到结构体中传入指针。这样既保留了局部性,又避免了全局变量的副作用。
参考答案加 static 的是内部链接,只在当前源文件可见;不加的是外部链接,可被其他文件用 extern 引用。考试中常考察此区别。