什么是静态存储,动态存储
静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。

动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。
典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,
调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。

从以上分析可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。
我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。 生存期表示了变量存在的时间。
生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。
一个变量究竟属于哪一种存储方式, 并不能仅从其作用域来判断,还应有明确的存储类型说明。

四种变量的存储方式和作用域
在C语言中,有以下四种变量:静态变量(static)、自动变量(auto)、寄存器变量(register)、外部变量(extern)。
其中自动变量和寄存器变量属于动态存储方式,外部变量和静态局部变量属于静态存储方式。
下面我们详细介绍这四种变量:

一、静态局部变量-静态存储
定义格式:
static 数据类型 变量名;

存储特点:
静态局部变量属于静态存储。
在程序执行过程中,即使所在函数调用结束也不释放。
换句话说,在程序执行期间,静态局部变量始终存在,但其它函数是不能引用它们的。

初始化:
定义但不初始化,则自动赋以"0"(整型和实型)或'\0'(字符型);
且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值!

使用场合:
需要保留函数上一次调用结束时的值。
变量只被引用而不改变其值。

二、自动变量-动态存储
定义格式:
[auto] 数据类型 变量名;

存储特点:
自动变量属于动态存储方式。
在函数或复合语句中定义的自动变量,只在该函数复合语句内有效;函数复合语句被调用时分配存储空间,调用结束就释放。

初始化:
定义而不初始化,则其值是不确定的。
如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。

由于自动变量的作用域和生存期,都局限于定义它的个体内(函数或复合语句),
因此不同的个体中允许使用同名的变量而不会混淆。
即使在函数内定义的自动变量,也可与该函数内部的复合语句中定义的自动变量同名。
建议:系统不会混淆,并不意味着人也不会混淆,所以尽量少用同名自动变量!

自动变量与静态局部变量的示例如下:

void  auto_static()
{
int var_auto=; /*自动变量:每次调用都重新初始化*/
static int var_static=; /*静态局部变量:只初始化1次*/
printf(“var_auto=%d, var_static=%d\n”, var_auto, var_static);
++var_auto;
++var_static;
}
void main()
{ int i;
for(i=; i<; i++)
auto_static();
}

输出结果:

三、寄存器变量-动态存储
存储特点:
一般情况下,变量的值都是存储在内存中的。
为提高执行效率,C语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器变量。

定义格式:
register 数据类型 变量名;

寄存器变量需要注意以下几点:
1)只有局部变量才能定义成寄存器变量,即全局变量不行。
2)对寄存器变量的实际处理,随系统而异。例如,微机上的MSC和TC 将寄存器变量实际当作自动变量处理。
3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。

四、外部变量-静态存储
存储特点:
外部变量属于静态存储方式。又分为静态外部变量和非静态外部变量

静态外部变量
只允许被本源文件中的函数引用
定义格式: static 数据类型 外部变量名;

非静态外部变量
允许被其它源文件中的函数引用
定义时缺省static关键字的外部变量,即为非静态外部变量。
定义格式:数据类型 外部变量名;
其它源文件中的函数,引用非静态外部变量时,需要在引用函数所在的源文件中进行说明:
格式:extern 数据类型 外部变量表;

静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:
1)定义的位置不同。
静态局部变量在函数内定义,静态外部变量在函数外定义。
2)作用域不同。
静态局部变量属于内部变量,其作用域仅限于定义它的函数内;
虽然生存期为整个源程序,但其它函数是不能使用它的。

静态外部变量在函数外定义,其作用域为定义它的源文件内;
生存期为整个源程序,但其它源文件中的函数也是不能使用它的。
3)初始化处理不同。
静态局部变量,仅在第1次调用它所在的函数时被初始化,
当再次调用定义它的函数时,不再初始化,而是保留上1次调用结束时的值。
而静态外部变量是在函数外定义的,不存在静态内部变量的“重复”初始化问题,
其当前值由最近1次给它赋值的操作决定。

把局部变量改变为静态内部变量后,改变了它的存储方式,即改变了它的生存期。
把外部变量改变为静态外部变量后,改变了它的作用域,限制了它的使用范围。
因此,关键字“static”在不同的地方所起的作用是不同的。

C++静态存储,动态存储的更多相关文章

  1. LR静态存储/动态存储/指针变量脚本说明

    在一次教程学习中,看到该知识点并记录了下来,希望与大家共同探讨学习. 一.静态存储与动态存储 静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束.动态存储变量是在程序执行过 ...

  2. C 静态存储动态存储

    首先,我们可以把程序所占的内存空间分为三个部分:(可以根据静态资源区.栈区.堆区来划分) 静态存储:程序运行期间由系统分配固定得到存储空间(栈): 动态存储:开发者根据自身需要进行动态分配的存储空间( ...

  3. C++中的数据存储方式自动存储、静态存储和动态存储

    C++中变量存储方式有三种,自动存储,静态存储,动态存储 自动存储简单意义上就是在函数内不用任何关键字直接定义的变量,它在函数被调用时被创建,在函数退出时自动消失, 静态存储顾名思义就是在程序的整个运 ...

  4. C++中的自动存储、静态存储和动态存储

    根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆).在存在是间的长短方面,以这三种方式分配的数据对象各不相同.下面简要介绍这三种类型( ...

  5. C++动态存储方式与静态存储方式

    如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...

  6. kubernetes 静态存储与动态存储

    静态存储   Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化.Kubernetes 将 Volume 分为持久化的 PersistentVo ...

  7. C语言动态存储分配

    动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串.数组 ...

  8. C/C++ 动态存储分配

    C语言的动态分配函数: malloc(m):开辟m字节长度的地址空间,并返回这段空间的首地址 sizeof(x):计算变量x的长度 free(p):释放指针p所指变量的存储空间,即彻底删除一个变量 C ...

  9. javascript实现数据结构与算法系列:线性表的静态单链表存储结构

    有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...

随机推荐

  1. acedGetString获取用户输入字符串

    acedGetString()[ads_getstring()]int acedGetString(int cronly, const TCHAR *prompt, TCHAR *psz) acedG ...

  2. 关于netbeans中的JComboBox(复选框)

    以最近写的选课系统中添加课程项为例 1.往复选框中放入选项(根据数据库添加) (1)首先将  属性—>model中默认Item1234清空 (2)获得数据库中的数据并放入. SelectCour ...

  3. “java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp”

    最近在项目中使用hibernate查询时,总报错“java.sql.SQLException: Value '0000-00-00' can not be represented as java.sq ...

  4. fix eclipse gc overhead limit exceeded in mac

    fix eclipse gc overhead limit exceeded: 在mac上找不到eclipse.ini文件编辑内存限制,在eclipse安装目录右击eclipse程序,选“显示包内容” ...

  5. 一段显示隐藏列表HTML代码

    一段显示隐藏列表HTML代码, 技巧在于把页面上的元素(“返回首页”)和控制显示/隐藏的元素(id=navs-menu)放在一个共同的div上,并在该div上绑定onmouseover和onmouse ...

  6. javascript笔记3-面向对象的程序设计-创建对象

    javascript的对象:无序属性的集合,而每个属性可以包含基本值.对象或者函数.举例: var person = new Object(); person.name = "Nichola ...

  7. HDOJ三部曲-DP-1017-pearls

    Pearls Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total Submis ...

  8. magento中比较好的博客

    magento web-开发   http://www.magentofront-end.com/magentomuban/category/web-frontend 水水博客专栏   http:// ...

  9. "Your local changes to the following files would be overwritten by merge" on git

    运行: git merge --ff origin/master 得到错误信息: error: Your local changes to the following files would be o ...

  10. PostgreSQL高可用性、负载均衡、复制与集群方案介绍

    目录[-] 一.高可用性.负载均衡.复制的几个方案比较: 二.多节点集群方案比较 9.3官方文档(中文):http://58.58.27.50:8079/doc/html/9.3.1_zh/high- ...