new chapter 6.pptVIP

  • 2
  • 0
  • 约 53页
  • 2016-11-25 发布于浙江
  • 举报
new chapter 6

6.8 变量的存储类型和作用域 一. 若干概念: 1. 作用域:变量的使用范围(由存储区域和说明的位置决定) 2.可见性:变量可被作用域内语句调用的属性 3.存在性:变量所分配存储空间的可使用属性 4.存储类型:auto--自动型 register--寄存器型 static--静态型 extern -----外部型 5. 静态存储:程序运行期间分配固定存储空间 6. 动态存储:程序运行期间根据需要动态分配存储空间 7. 用户内存: 二. auto——自动型/堆栈型变量 (1)存储在堆栈区/动态存储区。 (2)auto型变量在函数体内说明或缺省说明;形参缺省说明。 (3)值的暂时性:进入函数时分配堆栈空间,退出函数后,空间自动释放,变量不再存在,不得继续访问。 (4)auto型变量未初始化时,其值无意义,必须先赋初值再引用。 (5)作用域局部性,仅限于定义它的模块。 (6)可见性与存在性基本一致,但具有一定的独立性(在重名变量的作用域上不可见)。 void main( void ) { int x; { float x=2.5; { char x=c; printf(1st x=%c\n,x); } printf(2nd x=%f\n,x); } printf(3th x=%d\n,x); } 三. register——寄存器型变量 1. register型变量直接将数值存储在CPU的通用寄存器中,程序运行时无需读写内存即可使用,高效、便捷。 2. register型变量只能在函数体内说明、使用; 3.值的暂时性: register型变量进入函数时临时分配寄存器,退出函数后,寄存器自动释放,变量不再存在,不得继续访问。 4. 变量未初始化时,其值无意义。必须先赋值再使用! 5.一些系统的通用寄存器字长有限,register型变量不能为double, float型。 6. 由于CPU中的通用寄存器个数有限,register型变量数目太多会自动转为auto型。 7.优化的编译系统自动将使用频繁的变量放在寄存器中,不再需要程序员指定谁是register型变量。 四. static——静态型变量 1. 静态型变量存储在静态存储区 2. 静态型变量定义在函数内部时——局部静态变量,作用域仅限于函数内部;静态型变量定义在函数外部时——外部静态变量,作用域限于本源程序文件(寿命全局); 3.值的永久性:一经说明分配存储空间就一直占用该空间直到程序运行结束; 4. 变量未初始化时自动赋0值! 4. 可见性与存在性不一致; 5.编译时赋初值(仅一次:每次调用时不再赋初值,保留上次调用结束时的值!) // Program: EG06-20.C // Description: 打印1~10的阶乘数值。 #include stdio.h int fac(int n) { static int f=1; return f*=n; } void main( void ) { int i; for(i=1;i11;i++) printf(%d!=%d\n,i,fac(i)); } 基于全局变量的副作用,建议少用或不用全局静态变量。 五. extern——外部型变量 extern型变量存储在静态存储区,一般用于在多个编译单位之间传送数据; (1)extern型变量定义时缺省存储类型,说明时用extern扩展作用域; (2)作用域全局性、值的永久性、可见性与存在性一致; (3)extern型变量未初始化时自动赋0值; (4)extern型变量可多次说明,但只分配一次空间; (5)基于全局变量的副作用,建议少用或不用extern型变量。 例 引用其它文件中的外部变量 int global; extern float x; main() { int local; . . . } extern int global; static int number; func2() { . . . } float x; static int number; func3() { extern int global; . . . } file1.c file2.c file3.c int max(int x, int y) { in

文档评论(0)

1亿VIP精品文档

相关文档