
局部静态变量Static详解
发布日期:2021-05-07 00:50:46
浏览次数:21
分类:精选文章
本文共 1577 字,大约阅读时间需要 5 分钟。
在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其 初始化为0。
静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。 例如,下面的程序定义了全局变量、静态局部变量和局部变量: #include <iostream.h> void func(); int n = 1; //全局变量 void main() { static int a; // 静态局部变量 int b = -10; // 局部变量 cout << "a:" << a << " b:" << b << " n:" << n << endl; b += 4; func(); cout << "a:" << a << " b:" << b << " n:" << n << endl; n += 10; func(); } void func() { static int a = 2; // 静态局部变量 int b = 5; // 局部变量 a += 2; n += 12; b += 5; cout << "a:" << a << " b:" << b << " n:" << n << endl; }运行结果为:
a:0 b:-10 n:l a:4 b:10 n:13 a:0 b:-6 n:13 a:6 b:10 n:35 程序中主函数main()两次调用了func()函数,从运行结果可以看出,程序控制每次进入func()函数时,局部变量b都被初始化。而静态局部 变量a仅在第一次调用时被初始化,第二次进入该函数时,不再进行初始化,这时它的值是第一次调用后的结果值4。 main()函数中的变量a和b与func()函数中的变量a和b空间位置是不一样的,所以相应的值也不一样。关于变量作用域和可见性的进一步讨论见第6 章。 静态局部变量的用途有许多:可以使用它确定某函数是否被调用过。使用它保留多次调用的值。对静态局部变量的说明:
(1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。 (2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的 值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初 值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。 ———————————————— 版权声明:本文为CSDN博主「ShininGold」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zkangaroo/article/details/61202533发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月03日 22时40分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
spring启动错误:Could not resolve placeholder
2021-05-08
日志写入xml上传ftp遇到的问题
2021-05-08
下载任意版本vmware对应的vmware tools
2021-05-08
将 github 中他人的 仓库 导入 码云中,从而 加快下载速度的 方式
2021-05-08
Java 类加载的过程 加载、验证、准备、解析、初始化
2021-05-08
JavaWeb---实现JavaBean来接收参数、请求转发、域对象
2021-05-08
瀚高数据库中 java代码类型与bit对应(APP)
2021-05-08
选择性估算器绕过行安全策略漏洞
2021-05-08
PostgreSQL中的触发器
2021-05-08
对PostgreSQL数据库结构的宏观理解
2021-05-08
Postgresql 日期和时间类型
2021-05-08
xmin、xmax、cmin、cmax
2021-05-08
查询某表格上次进行vacuum的时间
2021-05-08
invalid byte sequence for encoding
2021-05-08
Highgo Database故障收集脚本
2021-05-08
failed to initialize the database
2021-05-08
invalid byte sequence for encoding
2021-05-08
银河麒麟系统配置apt网络源
2021-05-08
第七周 4.12-4.18
2021-05-08
程序设计入门14 结构体
2021-05-08