变量的存储类型

本文介绍了C语言中变量的存储类型,包括静态存储和动态存储,并详细解释了自动变量、静态局部变量、寄存器变量及全局变量的不同存储方式。通过本文,读者可以了解这些变量在内存中的存放位置和作用域。

变量的存储类型:

从变量值存在的时间(即生存期)看,变量的存储类型分为静态存储动态存储两种不同的方式。

静态存储方式:
在程序运行期间由系统分配固定的存储空间,其值存在的时间是从程序开始执行到程序结束
动态存储方式:
在程序运行期间根据需要进行动态的分配存储空间,其值存在的时间是从包含该变量定义的函数开始执行至函数执行结束

变量在内存中的存放位置和类型
C语言中可使用的存储空间分为三个,分别是:程序区、静态存储区、动态存储区。
程序区存放可执行程序的机器指令。
静态存储区存放全局变量和局部静态变量。
动态存储区存放局部变量、形参、和函数调用现场。

存储类型可以分为四种,分别是:auto 自动变量(动态存储区)、register 寄存器变量(CPU中的寄存器)、extern 外部变量(静态存储区)、static 静态变量(静态存储区)。

局部变量的存储方式(自动变量、静态局部变量、寄存器变量):

1.自动变量(auto):函数中的局部变量,不做任何存储类别的说明都为自动变量。
说明:

  1. 自动变量必须在一个函数体的内部,分配在动态存储区。
  2. 自动变量不赋初值,其值不确定。每调用一次,重新赋值一次。
  3. 函数的形参也是自动变量。
  4. “自动”体现在进入语句块时自动申请内存,退出时自动释放内存,对其进行的分配和释放存储空间的工作,由编译系统自动处理。

2.静态局部变量(static):函数中局部变量的值在函数调用结束后不消失(以后一直存在并总是保持它的最新值,即具有记忆性),即不释放存储单元。此时可指定该变量为“静态局部变量”。定义形式:static 类型说明符 变量名;
特性:

  1. 静态局部变量系统自动初始化为0,存放在静态存储区;生存期为整个程序运行期间;
  2. 静态局部变量和全局变量都是静态存储类型,但作用域不同;
  3. 静态局部变量在编译时赋初值,每次调用时不再赋初值,只保留调用结束时变量的值。其值在整个程序运行期间都不释放。即上一次调用的结果会被保存下来。

3.寄存器变量(register):对频繁使用的变量,为减少存取变量花费的时间,C语言允许将局部变量的值存放在CPU运算器的寄存器中,称为“寄存器变量”,用关键字“register”说明。定义形式:register 类型说明符 变量名;
说明:

  1. 寄存器变量的类型一般只限于整型、字符型或指向整型、字符型的指针,且只用于局部变量和形参。
  2. 全局变量、局部静态变量不可以作为寄存器变量。
  3. 不能定义任意多个寄存器变量,一个计算机系统中寄存器的数目是有限的。不能取寄存器变量的地址。

全局变量的存储方法(外部类型、静态类型)
1.外部全局变量:一个文件中要引用其他文件中定义的变量,应该在需要引用此变量的文件中用extern进行说明。
2.静态全局变量:一个文件中的全局变量仅限于定义它的文件引用,而不能被其他文件访问,需要用static进行说明。
说明:

  • 外部全局变量与静态全局变量在同一文件内的作用域一样;
  • 外部全局变量可以被多个文件引用,而静态全局变量仅在定义它的文件内有效,在程序的其他文件中不可使用。
在C和C++中,变量除了有数据类型的属性之外,还有存储类别的属性,存储类别指的是数据在内存中存储的方法,存储方法有静态存储和动态存储两大类。变量的存储类别主要有4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern),根据变量的存储类别,可以知道变量的作用域和存储期[^1][^2]。 用户的存储空间可以划分为三个部分:程序区、静态存储区、动态存储区[^3]。 ### 自动变量(auto) 函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量,自动变量用关键字auto作存储类别的声明。例如: ```c int f(int a) /*定义f函数,a为参数*/ { auto int b, c=3; /*定义b、c自动变量*/ // ... } ``` 在实际使用中,关键字`auto`常常可以省略不写。 ### 静态变量(static) 静态变量存储在静态存储区,其生命周期贯穿整个程序运行期间。静态变量又可分为静态局部变量和静态全局变量。静态局部变量在函数调用结束后不会销毁,下次调用函数时,该变量会保留上一次调用结束时的值;静态全局变量的作用域仅限于定义它的文件,其他文件无法访问。 ### 寄存器变量(register) 寄存器变量建议编译器将变量存储在CPU的寄存器中,而不是内存中,这样可以提高变量的访问速度。但这只是一种建议,编译器可能会根据实际情况决定是否采用。寄存器变量的声明使用`register`关键字,例如: ```c register int speed; ``` 需要注意的是,寄存器变量不能取地址,因为寄存器不在内存中,没有内存地址。 ### 外部变量(extern) 外部变量用于声明在其他文件中定义的全局变量,使得该变量可以在当前文件中使用。`extern`关键字用于声明外部变量,但不分配存储空间。例如,在文件A中定义了全局变量`int num = 10;`,在文件B中若要使用该变量,可以这样声明: ```c extern int num; ``` 这样就可以在文件B中访问和修改`num`的值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值