第九章 函数进阶
多函数程序的执行过程
见图k
变量的作用域和生存期
- 代码示例:
1 |
|
注意:
1、变量只存在于定义他们的语句块中
2、变量在一个块内声明时创建,在这个块结束时销毁-自动变量
作用域
- 代码示例:
1 |
|
局部变量
1 | void changNum() |
全局变量
1 | int count = 0; |
变量的存储类型
存储类型说明符 | 存储类型 | 说明 |
---|---|---|
auto | 自动存储 | 只能用于块作用域的变量声明中,局部变量默认情况下归为自动存储类型 |
register | 寄存器存储 | 只用于块作用域的变量,请求速度快。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义位寄存器变量 |
static | 静态存储 | 载入程序时创建对象,程序结束时对象消失 |
extern | 外部变量 | 说明符表示声明的变量定义在别处。作用域是整个程序,生存期贯穿应用程序的开始和结束 |
变量的存储类型示例
1 |
|
1 | extern int count;//引用式声明,外部链接 |
传值调用
传值调用的机制
- 按值传递
- 给函数传递变元(参数)时,变元(参数)值不会直接传递给函数,而是先制作变元(参数)值的副本,存储在线上,再使这个副本可用于函数,而不是使用初始值
代码示例:
1 |
|
- 引用传递
- 指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
1 |
|
使用数组作为函数参数1
1 |
|
1 | void input(double scores[]) |
1 | void sort(double scores[]) |
1 | void show(double scores[]) |
注意:
1、数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组的空间
2、当用数组名作为实参调用函数时,数组首地址指针九被传递到函数中
使用数组作为函数参数2
1 |
|
1 | int find_index(int *p,int num) |
使用头文件
- 自定义头文件
- 一般放一些重复使用的代码,例如函数声明,变量声明,常量定义,宏的定义等
1 |
|
注意:
1、MYHEADER_H_INCLUDED为一个唯一的标号,命名规则跟变量的命名规则一样,常根据它所在的头文件来命名
2、代码含义:如果没有定义
MYHEADER_H_INCLUDED,则定义
MYHEADER_H_INCLUDED,并编译下面的代码部分,直到遇到#endif