静态变量与动态变量

0.静态存储与动态存储

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

2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放

3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式不同而产生的特性称为变量的生存期

4)静态存储只会初始化一次

 

摘自于:百度百科

 

1.区别

定义或者声明变量时,没有static修饰符的就是动态变量,有static修饰符的就是静态变量

 

2.动态变量(一下简称变量)

2.1全局变量

1)在所有函数的外部定义(包括主函数),定义之后的所有函数都能使用,属于静态存储

2)作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。外部文件可以通过extern关键字来声明另一个文件中存在的全局变量

3)生命周期为从程序运行到程序退出,即贯穿整个运行时间

4)无显式初始化时默认初始化值为0

看一个有关全局变量多文件的例子:

main.cpp


 
 
  1. #include <iostream>
  2. using namespace std;
  3. int var_a = 0;
  4. void fun1();
  5. void fun2();
  6. void fun0()
  7. {
  8. var_a = var_a + 1;
  9. cout << "fun1:" << var_a << endl;
  10. }
  11. int main()
  12. {
  13. fun0();
  14. fun1();
  15. fun2();
  16. fun0();
  17. system( "pause");
  18. return 0;
  19. }

variable1.cpp


 
 
  1. #include <iostream>
  2. using namespace std;
  3. extern int var_a;
  4. void fun1()
  5. {
  6. var_a = var_a + 1;
  7. cout << "fun3:" << var_a << endl;
  8. }

variable2.cpp


 
 
  1. #include <iostream>
  2. using namespace std;
  3. extern int var_a;
  4. void fun2()
  5. {
  6. var_a = var_a + 1;
  7. cout << "fun3:" << var_a << endl;
  8. }

运行结果:

可以发现,全局变量var_a在所有文件中都共享,每个文件都可以访问它并修改它的值

2.2局部变量

1)在函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问,否则会出现:

2)作用域为当前函数,从定义位置,到其所在的{}的结束位置

3)生命周期为从函数调用到函数退出

4)无显式初始化时默认初始化值为随机值

 

3.静态变量

3.1静态全局变量

1)作用域为当前文件,从定义/声明位置到文件结尾

2)生命周期为从程序运行到程序退出,即贯穿整个运行时间

3)无显式初始化时默认初始化值为0

静态全局变量与动态全局变量的主要不同:

动态全局变量可以通过extern关键字在外部文件中使用,但静态全局变量不可以在外部文件中使用。静态全局变量相当于限制了动态全局变量的作用域

看一个例子:


 
 
  1. #include <iostream>
  2. using namespace std;
  3. static int b = 10;
  4. void fun()
  5. {
  6. int b = 0;
  7. cout << "b = " << b << endl;
  8. b++;
  9. }
  10. int main()
  11. {
  12. for ( int i = 0; i < 5; i++)
  13. fun();
  14. system( "pause");
  15. return 0;
  16. }

得到结果:

为什么得到5个0呢,为什么不是0,1,2,3,4呢

这是因为在函数fun中定义了一个动态局部变量a,而a同时又是静态全局变量,在这种情况下,作用域小的掩盖作用域大的,所以局部变量会掩盖全局变量。所以动态局部变量a掩盖了静态全局变量a

3.2静态局部变量

1)作用域为当前函数,从定义位置,到其所在的{}的结束位置

2)生命周期为从程序运行到程序退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值

静态局部变量与动态局部变量的主要不同:

两者作用域相同,都在函数内部,但是两者生命周期不一样,静态局部变量的生命周期是到程序的结束,而动态局部变量的生命周期是函数的结束,静态局部变量的生命周期更长,同时静态局部变量只会初始化一次,函数重复调用,但静态局部变量不会被重新初始化

看一段代码:


 
 
  1. #include <iostream>
  2. using namespace std;
  3. void fun()
  4. {
  5. int a = 0;
  6. static int b = 0;
  7. cout << "a = " << a << endl;
  8. cout << "b = " << b << endl;
  9. a++;
  10. b++;
  11. }
  12. int main()
  13. {
  14. for ( int i = 0; i < 5; i++)
  15. fun();
  16. system( "pause");
  17. return 0;
  18. }

执行结果:

得到这样的结果也是自然的

参考来源:

C语言动态变量与静态变量的区别

C和C++中全局变量,局部变量,静态变量和常量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值