【编程经验】变量的存储类型

在 C 语言中,变量是对程序中数据所占内存空间的一种抽象定义,定义变量时,用户定义变量的名、 变量的类型,这些都是变量的操作属性。不仅可以通过变量名访问该变量,系统还通过该标识符确定变量 在内存中的位置。

在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是 CPU 的寄存 器。变量的存储类型关系到变量的存储位置,C 语言中定义了 4 种存储属性,即自动变量、外部变量、静 态变量和寄存器变量,它关系到变量在内存中的存放位置, 由此决定了变量的保留时间和变量的作用范围。

变量的保留时间又称为生存期,从时间的角度,可将变量分为静态存储和动态存储两种情况。静态存 储是指变量存储在内存的静态存储区,在编译时就分配了存储空间,在整个程序的运行期间,该变量占有固定的存储单元.

程序结束后,这部分空间才释放,变量的值在整个程序中始终存在;动态存储是指变量 存储在内存的动态存储区,在程序的运行过程中,只有当变量所在的函数被调用时,编译系统才临时为该 变量分配一段内存单元,函数调用结束,该变量空间释放,变量的值只在函数调用期存在。

变量的作用范围又称为作用域,从空间角度,可以将变量分为全局变量和局部变量。局部变量是在一 个函数或复合语句内定义的变量,它仅在函数或复合语句内有效,

编译时,编译系统不为局部变量分配内存单元,而是在程序运行过程中,当局部变量所在的函数被调用时,编译系统根据需要,临时分配内存, 调用结束,空间释放;全局变量是在函数之外定义的变量,其作用范围为从定义处开始到本文件结束,编 译时,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元。

1. 自动变量

函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数据存储在动态 存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,在调用该函 数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变 量。自动变量用关键字 auto 进行存储类别的声明,例如声明一个自动变量:

int fun(int a)

{

auto int b,c=3; /*定义 b,c 为自动变量*/

}

a 是函数 fun()的形参,b、c 是自动变量,并对 c 赋初值 3。执行完 fun()函数后,自动释放 a、b、c 所占的存储单元。

2. 外部变量

外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件末尾。

如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern 对该变量进行“外部变量声明”。表示该 变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量. 用 extern 声明外部变量,扩展程序文件中的作用域

3. 静态变量

有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为静 态局部变量,用关键字 static 进行声明。

4. 寄存器变量

为提高效率,C 语言允许将局部变量的值存放在 CPU 的寄存器中,这种变量叫做寄存器变量,用关键字 register 声明。使用寄存器变量需要注意以下几点:

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

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

(3)不能使用取地址运算符“&”求寄存器变量的地址。

原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2018-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java多态的实现有哪些要求?实现多态的关键技术有哪些?

多态指的是允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。实现多态的方法是动态绑定( D...

14420
来自专栏GreenLeaves

Jquery 遍历数组之grep()方法介绍

grep()方法用于数组元素过滤筛选。 grep(array,callback,boolean);方法参数介绍。 array   ---待处理数组 callba...

20150
来自专栏nnngu

018 final 关键字的用途

final关键字的含义 final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,...

36060
来自专栏C语言及其他语言

【每日一题】问题 1195: 去掉双斜杠注释

题目描述 将C程序代码中的双斜杠注释去掉。 输入 输入数据中含有一些符合C++语法的代码行(每行代码不超过200个字符)。需要说明的是,...

31790
来自专栏章鱼的慢慢技术路

指针的使用

14630
来自专栏猿人谷

字节大小

首先看一个例子: 1 #include <iostream> 2 using namespace std; 3 4 class A{}; 5 6...

205100
来自专栏大数据钻研

Java基础语法

java 基 础 语 法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念...

29960
来自专栏黑白安全

关于PHP语言在内存中的分配(堆和栈的区别)

本文以PHP语言为例来分析计算机中各段存储区的区别,代码段、堆空间段、代码段、初始化静态常量段。

31520
来自专栏老司机的技术博客

人人都能学会的python编程教程10:调用函数

要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。

964130
来自专栏marsggbo

C++学习笔记之模板篇

一、模板 不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.h文件和.c文件,需要写成一个文件。 ...

22180

扫码关注云+社区

领取腾讯云代金券