静态变量与动态变量

静态变量与动态变量0.静态存储与动态存储1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式不同而产生的特性称为变量的生存期4)静态存储只会初始化一次 摘自于:百度百科…

大家好,又见面了,我是你们的朋友全栈君。

0.静态存储与动态存储

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

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

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

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

 

摘自于:百度百科

 

1.区别

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

 

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

2.1全局变量

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

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

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

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

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

main.cpp

#include <iostream>
using namespace std;

int var_a = 0;

void fun1();
void fun2();

void fun0()
{
	var_a = var_a + 1;
	cout << "fun1:" << var_a << endl;
}


int main()
{
	fun0();
	fun1();
	fun2();
	fun0();

	system("pause");
	return 0;
}

variable1.cpp

#include <iostream>
using namespace std;

extern int var_a;

void fun1()
{
	var_a = var_a + 1;
	cout << "fun3:" << var_a << endl;
}

variable2.cpp

#include <iostream>
using namespace std;

extern int var_a;

void fun2()
{
	var_a = var_a + 1;
	cout << "fun3:" << var_a << endl;
}

运行结果:

静态变量与动态变量

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

2.2局部变量

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

静态变量与动态变量

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

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

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

 

3.静态变量

3.1静态全局变量

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

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

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

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

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

看一个例子:

#include <iostream>
using namespace std;

static int b = 10;

void fun()
{
	int b = 0;
	cout << "b = " << b << endl;
	b++;
}

int main()
{
	for (int i = 0; i < 5; i++)
		fun();

	system("pause");
	return 0;
}

得到结果:

静态变量与动态变量

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

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

3.2静态局部变量

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

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

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

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

看一段代码:

#include <iostream>
using namespace std;

void fun()
{
	int a = 0;
	static int b = 0;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	a++;
	b++;
}

int main()
{
	for (int i = 0; i < 5; i++)
		fun();

	system("pause");
	return 0;
}

执行结果:

静态变量与动态变量

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

参考来源:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141588.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • qt运行cmd命令_cmd ping大包命令

    qt运行cmd命令_cmd ping大包命令0-问题描述在实现QT调用外部程序cmd.exe的时候传回来的参数需要显示在textbrowser控件上,但是一直等待数据全部接受完毕会才显示,会导致页面卡死的假象,所以下面利用append()进行每次都更新,可以很好的解决这个问题。1-解决方案//mainwindow.cpp文件,主界面实现#include”mainwindow.h”#include”ui_mainwindow.h…

    2022年9月15日
  • 最短路径Dijkstra算法原理及Matlab实现「建议收藏」

    最短路径Dijkstra算法原理及Matlab实现「建议收藏」图论的基础知识不再阐述。最短路径算法主要有二Dijkstra算法Floyd算法Dijkstra算法研究的是从初始点到其他每一结点的最短路径而Floyd算法研究的是任意两结点之间的最短路径以下图为例,首先介绍Dijstra的原理红字为各结点的编号,蓝字为各结点之间的距离首先定义几个变量结点个数n;二维矩阵M(nxn),距离矩阵,连通的结点间即为距离,不…

    2022年6月1日
  • response.setHeader各种用法详解

    response.setHeader各种用法详解一秒刷新页面一次response.setHeader("refresh","1");二秒跳到其他页面response.setHeader("ref

    2022年7月2日
  • Oracle19c安装教程及PLSQL配置常见错误解决办法

    Oracle19c安装教程及PLSQL配置常见错误解决办法本人电脑上也装了不少比较难以安装的程序,而且也亲身破解了一些软件,自己以前也安装过MySQL和DB2,原以为Oracle也差不多,直到我亲身经历了,我才知道什么是痛苦。帅帅本人在经历了长时间的折磨之后终于把Oracle安装完毕,可谓被折磨得一塌糊涂,暗无天日。或许这也是程序员的快乐之一吧(ง•_•)ง目录&下面是Oracle的一些安装步骤及安装过程中常见错误的修正…

    2022年5月20日
  • 在pycharm里面对文件夹或者文件进行重命名的一种方法「建议收藏」

    在pycharm里面对文件夹或者文件进行重命名的一种方法「建议收藏」因为你要进行重命名的文件有可能当前被引用着,你修改之后,原本可以跑通的程序有可能跑不通了。所以重命名输入重构(Refactor)的内容,所以在project选项卡中,选中文件或者文件名称,右键选择Refactor,再选择Rename即可。如图所示:随后会弹出 第一个是查找是不是有代码应用了它,第二个复选框含义是是否在注释和字符串中查找这个名称。有时候你需要修改重命名文件的相关引…

    2022年8月26日
  • C++this指针

    C++this指针1)以下说法不正确的是:(括号内为个人理解) A.this指针就是指向成员函数所作用的对象的指针 B.每个对象的空间中都存放着一个this指针 C.类的非静态成员函数,真实的参数比所写的参数多1(多一个this指针) D.静态成员函数中不能使用this指针(因为static函数不属于某个对象) this指针是类的一个自动生成…

    2022年5月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号