利用函数进行模块化程序设计

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寄存器:寄存器变量