1、第10章 函数中的变量,局部变量与全局变量变量的存储类别,10.1.1 局部变量10.1.2 全局变量,10.1 局部变量与全局变量,10.1.1 局部变量局部变量就是在函数内部或者块内定义的变量。局部变量只在它的函数内部或块内部有效; 例如: int func(int a,int b) /*函数func1*/ double x,y; main() int m,n; ,变量a,b,x,y只在func函数内有效,变量m,n只在main函数内有效,10.1.1 局部变量说明: 主函数main中定义的变量(m,n)也只在主函数中有效,并不是因为在主函数中定义而在整个文件或程序中有效。因为主函数也是一
2、个函数,它与其它函数是平行关系。 不同函数中可以使用相同的变量名,它们代表不同的变量,之间互不干扰。 在一个函数内部,还可以在复合语句(块)中定义变量,这些变量只在本复合语句中有效。,10.1.1 局部变量说明: 如果局部变量的有效范围有重叠,则有效范围小的优先 ,如: void main() int a,b,c;int c;c=a+b; ,局部变量c优先,a,b,c在此范围有效,范例10-1,10.1.2 全局变量在函数之外定义的变量称为全局变量,又称外部变量 。 例如: int a=2,b=5; /*全局变量*/ int f1() /*定义函数f1*/ double c,d; /*全局变量
3、*/ void f2() /*定义函数f2*/ main() /*主函数*/ int e,d; /*全局变量*/,e,f的作用域,c、 d 的作用域,a、 b 的作用域,范例10-2,10.1.2 全局变量注 意:当局部变量与全局变量同名时,在局部变量的作用范围内,全局变量不起作用,即局部变量优先。 在实际使用过程中,建议不在必要时不要使用全局变量。,范例10-3,10.2.1 自动类型(auto)10.2.2 寄存器类型(register)10.2.2 静态类型(static)10.2.2 外部类型(extern),10.2 变量的存储类别,10.2.1 自动类型(auto) 自动类型关键字
4、:auto。其一般形式为: auto 类型 变量名; 例如: int func1(int a) auto int b,c=3; ,10.2.2 寄存器类型(register) 寄存器类型变量的存储单元被分配在寄存器当中,用关键字register说明,其一般形式为: register 类型 变量名; 例如:register int a; 注意: 寄存器类型的变量不宜过多; 变量的长度应该与通用寄存器的长度相当,一般为int型或char型; 寄存器变量的定义通常是不必要的。,范例10-4,10.2.3 静态类型(static) 静态类型的变量占用静态存储区,用static关键字来说明,其一般形式为
5、: static 类型 变量名; 例如:static int a; 静态类型又分为静态局部变量和静态全局变量。,10.2.3 静态类型(static) 1、静态局部变量 定义在函数内的静态变量称为静态局部变量。 说明: 静态局部变量的生存期是整个程序的运行期间; 静态局部变量具有局部变量的性质,即其作用域是局限在定义它的本函数体内的,但其值仍然存在,因为存储空间并未释放。 静态局部变量的赋初值的时间是在编译阶段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。,范例10-5打印1到5的阶乘,10.2.3 静态类型(static) 2、静态全局变量 在定义全局变量时前面加上关键字
6、static,就是静态全局变量。 静态全局变量的特点是: 其作用范围(即作用域)是定义它的程序文件,而不是整个程序; 静态全局变量的生存期是整个程序运行期间; 使用静态全局变量的好处是同一程序的两个不同的源程序文件中可以使用相同名称的变量名,而互不干扰。,范例10-6,10.2.4 外部类型(extern) 在任何函数之外定义的变量都叫做外部变量。外部变量通常用关键字extern说明。其一般形式为: extern 类型 变量名; 例如:extern int a;extern double k; 在一个文件中定义的全局变量缺省为外部的,即extern关键字可以省略。但是如果其他文件如果要使用这个文件中定义的全局变量,必须在使用前用“extern”作外部声明。外部声明通常放在文件的开头。,范例10-7,【范例10-8】 编写程序,给出年、月、日,计算该日是该年的第几天。,10.3 综合应用计算该日是该年的第几天,编写一个函数,使输入的字符串反序存放,并在主函数中输入和输出字符串。要求该函数与主函数不在同一个文件中。,10.5 跟我上机,