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分量可看成头结点,其指 ...
随机推荐
- Python学习路程day5
冒泡排序 将一个不规则的数组按从小到大的顺序进行排序 data = [10,4,33,21,54,3,8,11,5,22,2,1,17,13,6] #第一次循环,最后一个数字不需要循环,因为最大值已经 ...
- 解决:HotSeat短信图标提醒有误
[操作步骤]正常收发短信.彩信. [测试结果]所有短信均已阅读,但在HOME界面的短信图标仍提示有一条短信未读.重启后仍存在. 经过分析,导致该情况的主要原因为当彩信已读的时候,launcher中进行 ...
- [转]Raft [Why Not Paxos]
http://blog.csdn.net/cszhouwei/article/details/38374603 动画讲解 http://thesecretlivesofdata.com/raft/ W ...
- 第一个Sprint冲刺第六天
讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:解决编写代码的问题 讨论地点:宿舍 进展:已开始对代码的编写
- 转:超链接a标签display属性的block和inline-block的用法说明
我们经常在设计网站的导航部分的时候,如果想让导航超链接hover显示背景,但稍不注意,默认的inline会让你抓狂,因为display:inline会将超链接显示为内联元素,即没有宽和高的作用效果,这 ...
- C++学习笔记6:多文件编程
1.添加文件到工程中: 2.函数调用时需要前向声明;以下为实例: //add.cpp int add(int x, int y) { return (x + y); } //main.cpp #inc ...
- Codis 集群搭建
Codis 集群搭建 1 安装go1.3.1 CentOS 7.0 安装go 1.3.1 1.1 下载go安装包 golang中国上下载 下载到Downloads下 1.2 解压 tar -zxf g ...
- cocos2d-html5版日历组件
根据一as3版本给改编成成了js版的.as3版本的地址: http://download.csdn.net/detail/fengye513/2722289 胜利项目做的差不多了,由于项目用的是c+ ...
- 怎样知道linux是否安装了mysql
1. 使用 [root@localhost Desktop]# rpm -qa |grep mysql (-qa查询已经安装的软件) mysql-libs-5.1.71-1.el6.x86_64 结果 ...
- 传话游戏—C++
编程之美一道简单的热身题,也是我们生活中常玩的传话游戏.(~.~芒果台玩过的) 题意如下: Alice和Bob还有其他几位好朋友在一起玩传话游戏.这个游戏是这样进行的:首先,所有游戏者按顺序站成一排, ...