九、函数
一、形式参数
在定义函数时后面括弧中的变量 例:int max ( int a,int b )
不占内存中的存储单元,只有发生函数调用时才被分配内存单元,调用结束后内存单元也被释放
二、实际参数
实参和形参的类型应相同或赋值兼容,如果不相同则会进行转换
实参向形参传递数据是“值传递”(相当于copy),是单向传递,只由实参传给形参
调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留原值
在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值
三、返回值
如果需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含 return 语句
如果不需要从被调用函数带回函数值可以不要 return 语句
返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型 例: int max ( float x , float y ) 函数值为整型
(在 C 语言中,凡不加类型说明的函数,自动按整型处理)
在定义函数时指定的函数类型一般和 return 语句中的表达式类型一致,如果不一致,以函数类型为准,自动转换
四、函数的调用
被调用的函数必须时已经存在的函数
如果使用库函数,文件开头用 #include 命令将调用有关库函数时所需用到的信息包含到本文件中来
如果使用自己定义的函数,而该函数的位置在调用它的函数的后面,应该在主调函数中对被调用的函数作声明
五、函数的嵌套调用
C语言不能嵌套定义函数,但可以嵌套调用函数
六、递归
在调用一个函数的过程中又出现直接或间接的调用该函数本身,这是C语言的特点之一
递归必须要有一个退出的条件,通常用 if 来判定
七、局部变量和全局变量
1、 局部变量:
a. 自动变量,即动态局部变量(离开函数,值就消失)
b. 静态局部变量(离开函数,值仍保留)
c. 寄存器变量(离开函数,值就消失)
(形式参数可以定义为自动变量或寄存器变量)
2、全局变量:
a. 静态外部变量(只限本文件引用)
b. 外部变量(即非静态的外部变量,允许其他文件引用)
主函数中定义的变量也只能在主函数中有效,主函数也不能使用其他函数中定义的变量
不同函数中可以用相同名字的变量,它们代表不同的对象,互不干扰
形式参数也是局部变量
在函数内定义的变量时局部变量,在函数之外定义的变量成为全局变量
全局变量可以在本文件中其他函数所共用
定义局部变量时不赋初值的话,编译时自动赋值为 0 ;如果不对自动变量赋初值,则自动赋值成一个不确定的值
不用全局变量的原因:
a. 全局变量在程序的全部执行过程中都占存储单元
b. 使用全局变量过多,会降低程序的清晰性
c. 使函数通用性降低
八、变量的存储类别 (C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别)
1、 静态存储
包括:静态局部变量(函数内有效) 静态外部变量(本文件内有效) 外部变量(其他文件可引用)
程序运行开始时由系统分配固定的存储空间
用 static 声明局部变量:局部变量的值在函数调用结束后不消失而保留原值
2、 动态存储
程序运行期间根据需要进行动态的分配存储空间
包括: 自动变量,寄存器变量,形式参数 (都是本函数内有效)
九、关于变量的声明和定义
定义性声明:需要建立存储空间( in a ;)
引用性声明:不需要建立存储空间( extern a ;)
声明包括定义,但非所有的声明都是定义