C++静态存储,动态存储
什么是静态存储,动态存储
静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。
动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。
典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,
调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。
从以上分析可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。
我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。 生存期表示了变量存在的时间。
生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。
一个变量究竟属于哪一种存储方式, 并不能仅从其作用域来判断,还应有明确的存储类型说明。
四种变量的存储方式和作用域
在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++静态存储,动态存储的更多相关文章
- LR静态存储/动态存储/指针变量脚本说明
在一次教程学习中,看到该知识点并记录了下来,希望与大家共同探讨学习. 一.静态存储与动态存储 静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束.动态存储变量是在程序执行过 ...
- C 静态存储动态存储
首先,我们可以把程序所占的内存空间分为三个部分:(可以根据静态资源区.栈区.堆区来划分) 静态存储:程序运行期间由系统分配固定得到存储空间(栈): 动态存储:开发者根据自身需要进行动态分配的存储空间( ...
- C++中的数据存储方式自动存储、静态存储和动态存储
C++中变量存储方式有三种,自动存储,静态存储,动态存储 自动存储简单意义上就是在函数内不用任何关键字直接定义的变量,它在函数被调用时被创建,在函数退出时自动消失, 静态存储顾名思义就是在程序的整个运 ...
- C++中的自动存储、静态存储和动态存储
根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆).在存在是间的长短方面,以这三种方式分配的数据对象各不相同.下面简要介绍这三种类型( ...
- C++动态存储方式与静态存储方式
如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...
- kubernetes 静态存储与动态存储
静态存储 Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化.Kubernetes 将 Volume 分为持久化的 PersistentVo ...
- C语言动态存储分配
动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串.数组 ...
- C/C++ 动态存储分配
C语言的动态分配函数: malloc(m):开辟m字节长度的地址空间,并返回这段空间的首地址 sizeof(x):计算变量x的长度 free(p):释放指针p所指变量的存储空间,即彻底删除一个变量 C ...
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
随机推荐
- 使用 VisualVM 进行性能分析及调优
VisualVM 是一款免费的性能分析工具.它通过 jvmstat.JMX.SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态 ...
- hdu 2027
ps:发现语文理解能力不行也是醉醉的....是每个测试实例空行....空!行!不是空格! 还有就是gets才能吸收空格,而scanf不能. 代码: #include "stdio.h&quo ...
- hadoop中Text类 与 java中String类的区别
hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的 ...
- 初次使用百度地图API
因为项目需要,不得不使用百度地图的API,以前从未了解过API,这不是唬人,真的,所以对百度地图API充满了恐惧,但是到后面,已经麻木了.期间遇到过很多错误,每一个都弄得头大,借博客的名义把平时遇到的 ...
- Kylin上chromium不能用flash的解决命令
sudo apt-get update sudo apt-get install pepperflashplugin-nonfree sudo update-pepperflashplugin-non ...
- 【LeetCode OJ】Best Time to Buy and Sell Stock II
Problem Link: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ We solve this prob ...
- .NET概念:.NET程序编译和运行
.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...
- magento后台登陆被锁定 索引报错的解决:General error: 1205 Lock wait timeout
1. magento在索引的时候用shell,有时候会报错: General error: 1205 Lock wait timeout exceeded 这个时候,是因为行锁的原因,在表中您直接用s ...
- Inherits、CodeFile、CodeBehind的区别
Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计Web 窗体,可使页代码能够更清晰地从 HTML 内容中分离到完全单独的文件中. 通常一个 @pa ...
- clone 深拷贝 浅拷贝
1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性 2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set ...