变量存储类别

看书时遇到int a[] 属于自动存储类型,
了解后发现C语言的变量既有类别?
接下来浅聊下存储类别
C语言中存储类别又分为四类:

1.自动(auto)

2.静态(static)

3.寄存器的(register)

4.外部的(extern)

在介绍了变量的存储类型之后
可以知道对一个变量的说明不仅应说明其数据类型 还应说明其存储类型。

Static bool a 静态存储类型
auto float a 自动存储类型
static char a 静态整形类型
extern int x 外部引入类型
在这里插入图片描述

自动(auto)

1、 用关键字auto定义的变量为自动变量

  • auto可以省略 ,auto不写则隐含定为“自动存储类别”

auto 属于动态存储方式, 动态存储?

  • 自动变量属于动态存储方式

只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。

函数调用结束,释放存储单元,结束生存期。
因此函数调用结束之后,自动变量的值不能保留。
在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。
注意在函数里面的生存周期到函数结尾
外部引用函数里的auto的行为是未定义
其他函数auto变量重名是可以的可在其他函数定义

重名的auto仅在引用当前函数有效

静态(static)

2、 用static修饰的为静态变量,
如果定义在函数内部的,称之为静态局部变量;
如果定义在函数外部,称之为静态外部变量。如下为静态局部变量:
**

  • [ 1] 静态全局变量

**

全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。

全局变量本身就是静态存储方式,在一开始已经定义好了生命周期
这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,
在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,
只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。

注意:

2 静态局部变量属于静态存储类别,

  在静态存储区内分配存储单元,在程序整个运行期间都不释放;
  静态局部变量在编译时赋初值,即只赋初值一次;
      静态的生命周期取决于定义时的方法位置在方法结尾结束周期
  如果在定义局部变量时不赋初值的话则对静态局部变量来说

编译时自动赋初值0 ,(对数值型变量)或空字符(对字符变量)。

寄存器变量 (register)

3、为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中
这种变量叫“寄存器变量”,用关键字register作声明。例如:
register int c;
注意:

只有局部自动变量和形式参数可以作为寄存器变量;

一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;

局部静态变量不能定义为寄存器变量。
因为寄存器变量的生命周期是使用完即消逝,静态局部变量会保存值可下次使用

外部变量 ( extern )
4、用extern声明的的变量是外部变量
外部变量的意义是某函数可以调用在该函数之后定义的变量。

在C语言中不能被其他源文件调用的函数称谓内部函数
内部函数由static关键字来定义,
因此又被称谓静态函数,形式为: static [数据类型] 函数名([参数])

这里的static是对函数的作用范围的一个限定
限定该函数只能在其所处的源文件中使用
因此在不同文件中出现相同的函数名称的内部函数是没有问题的。

在C语言中能被其他源文件调用的函数称谓外部函数

外部函数由extern关键字来定义,形式为: extern [数据类型] 函数名([参数])

C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数
因此当需要定义外部函数时extern也可以省略。

在声明数组后没有进行初始化的时候
静态(static)和外部(extern)类型的数组元素初始化元素为0
自动(auto)类型的数组的元素初始化值不确定。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值