利用函数进行模块化程序设计
6.1.1 什么是函数
函数就是用来实现功能的
6.1.2 程序和函数
在c语言中,函数不能嵌套函数;系统从main函数开始执行,函数间可以互相调用,但不能调mian函数
函数的分类(从用户角度)
- 库函数
- 自定义函数
从函数形式上看
- 有参函数
- 无参函数
6.2 定义函数
在使用函数时,必须先声明,再使用
声明格式
返回类型 函数名([参数,···])
{
声明;
语句;
}
[]中是可选项,注意函数返回的值类型要和声明的类型相同
6.3.1 形式参数和实际参数
形参:例如函数声明里面的参数,程序运行时才分配内存,调用结束后,内存释放;
实参:比如调用函数时候赋的实际的参数,可以是常量,变量或表达式
c语言中,实参向形参传递的是值的拷贝,不是值本身,所以如果函数改变了拷贝的值,并不会改变实参的值
如果真正想改变实参的值,可以用引用的办法,即传一个实参地址的拷贝,在修改拷贝的内容是,实际上就是修改了实参的内容;
6.5 函数调用
略
6.6 函数递归调用
就是函数自己调自己本身,return 自己;
6.7 数组作为函数参数
形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。
在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。
多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去 第一维的长度。
6.9 变量的作用域
全局变量和局部变量是对于变量的作用域来说的
作用域:即变量作用的范围
全局变量:在函数外部定义的变量,可以被本程序的其他函数公用,习惯全局变量第一个字母大写、
- 全局变量在程序执行过程中都占用内存
- 如果全局变量,局部变量重名,那么在局部变量作用域内,以局部变量为准
局部变量:在函数内部定义的变量,只在定义的函数内有用
- 主函数中定义的变量,也只在主函数中有效
- 形参也是局部变量,其它函数可以调用该函数,但不能应用该函数的形参
6.9.1 变量的存储方式
变量有两种存储方式,静态存储和动态存储,是基于生存期
生存期:即变量存在的时间
静态存储:是程序运行时分配固定的内存的方式
动态存储:是程序运行时动态分配内存的方式
6.9.2 变量的存储类别
1.自动变量 auto
自动变量,调用函数时,会给它申请内存,结束释放内存
2.静态局部变量 static
所有函数调用结束后,仍然存在的变量,保存其值;局部变量
3.全局变量 extern
全局变量是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern
对该变量作“外部变量声明”。表示该变量是一个 已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量
4.寄存器变量 register
效率非常高的变量,放在cpu寄存器中,这是个建议式的标识符,程序把变量放不放到cpu中取决于编译器
6.9.3 变量的存储位置
静态存储区:静态局部变量,静态全局变量,外部变量
动态存储区:自动变量和形参
cpu寄存器:寄存器变量