存储类

作用域 

作用域可分为代码块作用域,函数原型作用域以及文件作用域

  • 代码块作用域:譬如函数的形参,函数体中定义的变量。作用范围从变量被定义的地方开始,到包含该定义的花括号结束,如:

for(int i = 0; i < 10; i++){  //变量i的作用范围是for循环体内
  ...
}

  • 函数原型作用域:适用于函数原型中使用的变量名。作用范围从变量定义处开始,到原型声明末尾,如:
void use_a_VLA(int n, int m, int ar[n][m]);  //如果在方括号中使用变量名,则该变量名必须是在该原型中定义了的

  • 文件作用域:一个在所有函数之外定义的变量具有文件作用域,范围从它定义的地方开始,到包含该定义的文件结尾处

 

链接类型

链接可分为外部链接,内部链接和空链接

  • 外部链接:可以在一个多文件程序的任何地方使用
  • 内部链接:可以在一个文件的任何地方使用。具有文件作用域的变量可能有内部或外部链接,用static声明的文件作用域的变量为内部链接,否则为外部链接
  • 空链接:由其定义所在的代码块或函数原型所私有的,具有代码块作用域或者函数原型作用域的变量有空链接

 

存储时期

存储时期可分为静态存储时期和自动存储时期

  • 静态存储时期:在程序执行期间将一直存在。具有文件作用域变量都是静态存储时期
  • 自动存储时期:具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定义这些变量的代码块时,为这些变量分配内存;退出这个代码块时,分配的内存被释放

 

它们的组合——存储类

根据作用域,链接以及存储时期的不同组合,有以下5种存储类

存储类时期作用域链接声明方式
自动变量自动代码块代码块内
寄存器变量自动代码块代码块内,使用关键字register
外部变量静态文件外部所有函数之外
具有内部链接的静态变量静态文件内部所有函数之外,使用关键字static
空链接的静态变量静态代码块代码块内,使用关键字static

综上所述:一般情况下,具有文件作用域(定义在所有函数之外,包括main函数)的变量具有外部链接,并且是静态的,称之为外部变量。但若对该外部变量使用关键字static,则其只具有内部链接,即只在定义该变量的文件内可见,但其仍是静态的。另一方面,一般情况下具有代码块作用域(即函数内定义)的变量是空链接,且为自动的。若对该变量使用关键字static,则存储时期由自动转为静态,但仍为空连接。因此,static对于文件作用域变量和代码块作用域变量有不同的意义:对文件作用域变量,加static将其限制为单文件私有,即改变了链接属性;对代码块作用域,static将其变为静态存储,改变了存储时期

 

其他

1.自动变量不会被默认初始化

2.寄存器变量和自动变量的唯一不同之处在于:它可能被放在CPU寄存器中,被更快地访问和操作。将变量声明为register只是一个请求,而非一条直接的命令。编译器必须在请求与可用寄存器的数量之间进行权衡。当不能分配寄存器时,变量退化为自动变量。另外,不能对寄存器变量使用地址运算符,即使是退化成为自动变量也不行

3.对函数参数不能使用static

4.如果外部变量是在别的文件中定义的,则必须使用extern来进行引用声明。与自动变量不同的是,外部变量会被默认初始化为0。一个外部变量只能进行一次初始化,并且必须是在变量定义时进行。注意下面是错的:

extern char permis = 'Y';  //错误,extern表示这是一个外部变量的引用声明,而非定义

5.内部链接的静态变量同样用extern来进行声明

6.多文件:复杂的C程序往往使用多个独立的代码文件。有些时候,这些文件可能需要共享一个外部变量。可以通过在一个文件中定义外部变量,在其他文件中利用extern进行引用声明来实现对这个变量的共享。也就是说,除了定义之外,其他所有引用声明都必须使用关键字extern,并且只有在定义时才能对该外部变量进行初始化

7.不能将auto,register,static,extern作为typedef的一部分

8.函数也具有存储类,默认情况下函数是外部的。若将函数定义为static,则表示该函数只可以在定义它的文件中使用,这保证了为一个特定模块创建私有的函数,从而避免名字冲突。可使用extern来声明定义在其它文件中的函数,这也不是必须的,因为若函数不被声明为static,则默认为extern

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值