存储类(存储模型)总结

最近在复习C语言,做了一些笔记,现在把自认为有价值的与大家共享。

版权归原属作者所有~~~~~~~~~~~~~~~

 

 

C语言使用作用域、链接和存储时期来定义5个存储类:自动、寄存器、具有代码块作用的静态、具有外部链接的静态以及具有内部链接的静态。

 

 

自动变量具有代码块作用域、空链接和自动存储时期。他们是局部的,为定义它们的代码块(通常是一个函数)所私有。寄存器变量和自动变量具有相同的属性,但编译器可能使用速度更快的内存或寄存器来存储寄存器变量。无法获取一个寄存器变量的地址。

         具有静态存储时期的变量可能具有外部链接、内部链接或空链接。当变量在文件的所有函数之外声明时,它是一个具有文件作用域的外部变量,具有外部链接和静态存储时期。如果在这样的声明中加上关键字static,将获得一个具有静态存储时期、文件作用域和内部链接的变量。如果在函数内使用static声明变量,变量具有静态存储时期、代码块作用域和空链接。

         当程序执行到包含变量声明的代码块时,给具有自动存储时期的变量分配内存,并在代码块结束时释放这部分内存。如果没有初始化,这样的变量具有无效值。在编译程序时给具有静态存储时期的变量分配内存,并且在程序运行时一直保持。如果没有初始化,这样的变量被置为0。具有代码块作用域的变量局部于包含变量声明的代码块。

         具有文件作用域的变量对文件中在它的声明之后的所有函数可见。如果一个文件作用域变量具有外部链接,则他可以在程序中的其他文件中使用。如果一个文件作用域变量具有内部链接,它只能在声明他的文件中使用。

 

 

 

注:1.链接是由作用域决定的。具有代码块作用域或函数原型作用域的变量有空链接;具有文件作用域的变量可能具有外部链接或内部链接。

         2.一个具有外部链接的变量可以在一个多文件程序的任何地方使用。一个具有内部链接的变量可以在文件的任何一个地方使用。

 

 

 

 

关键字staticextern的意义随上下文而不同。

C语言中有5个作为存储类说明符的关键字,他们是autoregisterstaticextern以及typedef

关键字typedef与内存存储无关,由于语法原因被归入此类。

特别的,不可以在一个声明中使用一个以上存储类说明符,这意味着不能将存储类中的任一存储类说明符作为typedef的一部分。

 

 

说明符auto表明一个变量具有自动存储时期。该说明符只能用在具有代码块作用域的变量声明中,而这样的变量已经具有自动存储时期,因此,auto主要用来明确指出意图,使程序更易读。

 

 

说明符register也只能用于具有代码块作用域的变量。他将一个变量归于寄存器存储类,这相当于请求把该变量存储在一个寄存器内,以便快速的存取。它的使用也使您不能够获取变量的地址。

 

 

说明符static在用于具有代码块作用域的变量声明中时,使该变量具有静态存储时期,从而得以在程序运行期间(即使包含该变量的代码块没有运行时)存在并保留其值。变量仍具有代码块作用域和空连接。static用于具有文件作用域的变量声明中时,表明该变量具有内部链接。

 

 

说明符extern表明您在声明一个已经在别处被定义了的变量。如果包含extern的声明具有文件作用域,所指向的变量必然具有外部链接。如果包含extern的声明具有代码块作用域,所指向的变量可能具有外部链接也可能具有内部链接,这取决于该变量的定义在本文件还是在程序的其他文件中。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值