aver在c语言中的作用,第12章 c语言中用户标识符的作用域及存储类.pdf

第十二章

第十二章

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变量的说明应尽量靠近其使用的地方.用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值