第8章 变量的作用域和存储类别.ppt
第第8章章 变量的作用域和存储类别变量的作用域和存储类别考试类型:笔试考试类型:笔试+上机上机所占分值:笔试所占分值:笔试8 8分分8.1 变量的作用域变量的作用域指在源程序中定义变量的位置及其能被读指在源程序中定义变量的位置及其能被读写访问的范围写访问的范围分为分为局部变量局部变量(Local VariableLocal Variable)全局变量全局变量(Global Variable)(Global Variable)局部变量局部变量局部变量局部变量在语句块内定义的变量在语句块内定义的变量形参也是局部变量形参也是局部变量定义时不会自动初始化,除非程序员指定初值定义时不会自动初始化,除非程序员指定初值进入语句块时获得内存,仅能由语句块内语句进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰并列语句块各自定义的同名变量互不干扰 P127 例例8-1 分析以下程序的输出结果。分析以下程序的输出结果。#include int func();main()int a=1;func();printf(a=%dn,a);int func()int a;a=2;printf(a=%dn,a);a=2a=1全局变量全局变量全局变量全局变量在所有函数之外定义的变量在所有函数之外定义的变量在程序中定义它的位置以后都有效在程序中定义它的位置以后都有效自动初始化为自动初始化为0 0从程序运行起即占据内存,程序运行过程中可随时从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存访问,程序退出时释放内存 在定义点之前或在其他文件中引用,应该进行如下在定义点之前或在其他文件中引用,应该进行如下声明:声明:extern extern 类型名类型名 变量名变量名;使函数之间的数据交换更容易,也更高效使函数之间的数据交换更容易,也更高效但是并不推荐使用但是并不推荐使用因为谁都可以改写全局变量,所以很难确定是谁改因为谁都可以改写全局变量,所以很难确定是谁改写了它写了它尽量少用全局变量。不得不用时,要严格控制对它的尽量少用全局变量。不得不用时,要严格控制对它的改写改写P128 例例8-2 分析以下程序的输出结果。分析以下程序的输出结果。#include int a=3,b=5;/*a、b为全局变量为全局变量*/max(int a,int b)/*a、b为局部变量为局部变量*/int c;c=ab?a:b;return c;main()int a=8;/*a为局部变量为局部变量*/printf(%dn,max(a,b);此此a a为局部变量为局部变量8 8,全局变量被屏蔽。全局变量被屏蔽。8.2 变量的存储类别变量的存储类别指数据在内存中存储的方式,即编译器为指数据在内存中存储的方式,即编译器为变量分配内存的方式,它决定变量的生存变量分配内存的方式,它决定变量的生存期期动态存储动态存储根据需要临时分配存储空间,离开即释放根据需要临时分配存储空间,离开即释放静态存储静态存储在程序运行期间分配固定的存储空间不释放在程序运行期间分配固定的存储空间不释放程序区程序区静态存储区静态存储区动态存储区动态存储区形参、自动形参、自动变量、函数变量、函数调用的现场调用的现场等等全局变量、全局变量、静态变量静态变量自动变量自动变量(auto)“自动自动”体现在体现在进入语句块时自动申请内存,退出时自动释放进入语句块时自动申请内存,退出时自动释放内存内存 动态局部变量动态局部变量标准定义格式标准定义格式auto auto 类型名类型名 变量名变量名;缺省的存储类型缺省的存储类型不初始化时,值是不确定的不初始化时,值是不确定的静态变量(静态变量(static)一个函数的内部变量在函数退出后失效。再一个函数的内部变量在函数退出后失效。再次进入函数,变量值重新初始化次进入函数,变量值重新初始化把此变量定义为把此变量定义为staticstatic,则变量的值可以保存,则变量的值可以保存到下次进入函数到下次进入函数static static intint i;i;静态变量和全局变量都是静态存储类型静态变量和全局变量都是静态存储类型自动初始化为自动初始化为0 0从静态存储区分配,生存期为整个程序运行期间从静态存储区分配,生存期为整个程序运行期间但作用域不同但作用域不同P130 例例8-4 静态变量的应用静态变量的应用#include func(int a)int b=0;static c=3;a=c+,b+;return a;main()int a=2,i,k;for(i=0;i2;i+)k=func(a+);printf(%dn,k);4寄存器变量(寄存器变量(register)u寄存器寄存器CPUCPU的内部容量很有限但速度极快的存储器的内部容量很有限但速度极快的存储器u使用频率比较高的变量声明为使用频率比较高的变量声明为registerregister ,可以,可以使程序更小、执行速度更快使程序更小、执行速度更快register register 类型名类型名 变量名变量名;register register intint i;i;u现代编译器有能力自动把普通变量优化为寄现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为一般无需特别声明变量为registerregister