第十二章
第十二章
C语言中,标识符必须先定义,后使用.每个变量根
据位置和保存值的长短,它们都有不同的作用域和生
命期.
定义(definition):指给变量分配确定的存储单元.
说明(declaration):只是说明变量的性质,而并不分配
存储空间.
作用域:指变量在程序的某一部分中,是有定义的,可
以被C编译和连接程序所识别.这一特定的部分就是
该变量的作用域.
生命期:变量保存值的时间.
每个变量的作用域和它在程序中出现的位置有直接
的关系.据此我们可以划分为局部变量和全局变量.
§12.1局部变量,全局变量和存储分类
§12.1局部变量,全局变量和存储分类
在函数内部或复合语句内部定义的变量,称为局
部变量(也称内部变量).函数的形参也属于局部变量.
在函数外部定义的变量,称为全局变量(外部变量).
C语言中,有两种存储类别:一种是自动类,一种是静
态类.局部变量既可说明成自动类,也可以说明成静态
类;而全局变量只能是静态类.
有四个与两种存储类别有关的说明符,它们是
auto( 自动),register(寄存器),static(静态)和extern(外
部).如:
auto int i,j; int auto i,j;
存储类别确定了所说明对像在内存中的存储位置,从
而也确定了所说明对象的作用域和生存期.
函数返回地址, 自动
动态存储区(堆栈) 类别的局部变量
全局变量及静态变
静态存储区 量
程序代码区
§12.2局部变量及其作用域和生存器
§12.2局部变量及其作用域和生存器
一.auto变量
当在函数内部或复合语句内定义变量时,如果没有
指定存储类,或使用了auto说明符,系统就认为所定义
的变量具有自动类别.
float a; auto float a;
auto类型的变量存储单元被分配在内存的动态存储
区.每当进入函数体或复合语句时,系统自动为auto变
量分配存储单元;退出时自动释放这此存储单元另作
他用.因此,这类局部变量的作用域是从定义的位置起,
到函数体或复合语句结束为止.例如:
void sub(float a)
{ int i;
:
if(i>0)
{ int n;
:
printf("%d\n",n);
}
:
}
以上,变量i,a和n都是auto变量,但是i,a的作用域是
整个函数,而n的作用哉仅限于if子句内.
注意:局部变量的定义必须放在函数体或复合语句
中全部可执行语句之前.
所以自动类的局部变量的存储单元都是在进入其所
在的函数体或复合语句时生成,退出其所在的函数体
或复合语句时消失.(变成无定义).这就是自动类局部
变量的"生存期".当再次进行入函数体或复合语句时,
系统将为它们重新分配存储单元.因此变量的值不
可能被保留.由于随着函数的频繁调用,动态存储区
内为某个变量分配的存储单元位置随程序的运行而
改变.变量中的初值也就随之而变,所以末赋初值的
自动变量其值不确定,称为"无定义".
进入时生成,退出时消失,这样的优点可在各函数
之间造成信息隔离,不同函数中使用了同名变量也不
会相互影响,从而可避免因不慎赋值所导致的错误影
响到其他函数.
二.register变量
寄存器变量也是自动变量,它与auto变量的区别仅
在于:用register说明的变量建议编译程序将变量的值
保留在cpu的寄存器中,而不是像一般变量那样,占内
存单元.因此,访问register变量要比其他类型的变量
快得多.
(1)cpu中寄存器的数目是有限的.因此只能说明少
量的寄存器变量.
(2) 由于register变量的值是放在寄存器内而不是放
在内存中,所以register变量没有地址.不能求地址.
(3)register变量的说明应尽量靠近其使用的地方.用
完