函数的两个重要作用:一是任务划分,即把一个复杂的任务划分为若干个简单的小任务,便于分工处理,也便于验证。二是软件重用,即把一些功能相同或相近的程序段,独立编程函数,让应用程序随时调用,而不需要编写雷同的代码。
3.1 函数的定义与调用
调用可嵌套,定义不可嵌套
3.1.1 函数定义 分为标准库函数和用户自定义函数
一般形式: 类型 函数名(形参){ }
函数定义时形参有类型
参数(自变量)是函数与外部传输数据的枢纽。若函数定义省略参数表,则称无参函数;
无参函数表示函数不依赖外部数据,执行独立的操作
若函数没有返回值,则使用空类型符void。
3.1.2 函数调用
方法:指定函数地址,提供实际参数。函数名是函数的地址,实际参数提供被调用函数执行任务所需要的信息及接受被调用函数返回值的信息。
形式: 函数名(实参)
实参用逗号分隔,且与形参个数类型位置对应
不管函数定义是否有参数或者是否有返回值,都可以用两种形式调用:函数语句或函数表达式。
3.1.3 函数的声明
声明加分号。声明在主函数里外都可以,但在外面声明可以省略在新函数中再声明一遍。
3.2 函数参数的传递
值传递(值调用) 指针传递(地址调用) 引用传递(引用调用)
调用时实参的值赋值给形参,并不改变实参。
如果实参值类型和形参对象类型不相同,将按形参的类型进行强制类型转移,然后赋给形参。
返回值:
有返回值的才能把返回值赋给变量,函数只有唯一的返回值且返回值类型是函数的类型。return可以终止函数,一个语句可以有多个return语句。
指针参数:实参的地址值赋给形参名标识的指针变量,被调用函数可以在函数体内通过形参指针来间接访问实参地址所指的对象。
引用参数:引用参数对应实参的对象名。函数被调用时,形参不需要开辟新的存储空间,形参名作为引用绑定于实参标识的对象上。执行函数体时,对形参的操作就是对实参的操作。直到函数执行结束,撤销引用绑定。
3.3 递归调用
直接或间接的调用本身
要素:描述问题规模逐步缩小的递归算法;描述基本情况的递归终止条件。
3.6 变量存储特性与标识符作用域
自动存储: 函数的参数和局部变量都是自动存储的。关键字register说明把变量存放在寄存器中。
静态存储:关键字有extern和static。static在第一次使用时进行初始化,函数退出时,系统保存起存储空间和数值。下次调用时,static变量还是上次退出时的值。
全局变量和局部变量:具有文件作用域的变量为全局变量,具有块作用域的变量成为局部变量。全局变量说明时默认初始值为0。当全局变量与局部量同名时,在块内,全局量被屏蔽。要在块内访问全局变量,可以用作用域运算符“::”。