C++全局变量与静态全局变量的异同(static与非static)
文章目录
- 生命周期与作用域
- 静态变量的声明——通过案例理解
- 案例:局部声明静态变量
- 案例:全局声明静态变量
- 问题探讨:
- 1. static全局变量与普通的全局变量有什么区别 ?
- 2. static局部变量和普通局部变量有什么区别 ?
- 3. static函数与普通函数有什么区别?
首先我们要知道两个概念:生命周期与作用域。
生命周期与作用域
生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。
作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。
根据上面两个定义,我们理解一下 static变量
static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。
可以认为static变量的作用域<=生存周期。
静态变量的声明——通过案例理解
案例:局部声明静态变量
在函数test中声明静态变量i:
void test()
{int m=3;static int i=5; // 声明局部静态变量 i
}
上面案例的局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量i不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和i的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,但是i仍存在于内存之中。
案例:全局声明静态变量
在文件A 中定义静态变量j:
int n=3; // 默认为extern
static int j=5; // 声明为static
全局变量和静态变量j都存放于程序的全局数据区域,它们的生存周期都是程序的整个运行期,但是n的作用域为全局作用域,可以通过extern在其他文件中使用,而j只能在文件A中使用,例如在文件B中:
extern int n; //ok
extern int j; //error: j在文件B中不可见
int a=n; //ok:但这里有个初始化先后的问题,具体参见参考一
int b=j; //error
可以看到,在B文件中使用A文件的n是没有问题的,但是就是不能访问A文件的 j 变量
也就是说,在声明全局的static变量时,static没有改变它的生存周期,也即存储位置(因为全局变量本来就存储在全局数据域),而是将变量的作用域限制在当前文件中。
这就说明: 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效。
问题探讨:
1. static全局变量与普通的全局变量有什么区别 ?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
这是因为 static全局变量只初使化一次,防止在其他文件单元中被引用;
2. static局部变量和普通局部变量有什么区别 ?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static局部变量只被初始化一次,下一次依据上一次结果值;
3. static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
C++全局变量与静态全局变量的异同(static与非static)相关推荐
- 全局变量与静态全局变量
1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量. 2)全 ...
- 全局变量、静态全局变量、静态局部变量和局部变量的区别
static和const都是C++中比较麻烦的东西,只要是太容易混淆他们的作用,之前对static做过点总结,但是不全面,还有很多小的错误,现在整理一下: 变量可以分为:全局变量.静态全局变量.静态局 ...
- 全局变量、静态全局变量、静态局部变量和普通局部变量的区别
按存储区域分:全局变量.静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1.全局变量在整个工程文件内都有效: 2.静态全局变量只在定义它的文件内有效: 3. ...
- C++全局变量,静态全局变量,不加修饰符的全局变量
1.C++全局变量一般指extern全局变量,作用域:多个文件 使用方式:.h声明全局变量 extern int a; 对应.cpp文件定义全局变量 int a=1; 其他cpp文件使用全局变量 if ...
- c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...
基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)...
我们先来看内存中的几大区: 内存到底分几个区? 下面有几种网上的理解,我整理一下: 一: 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构 ...
- 【C语言局部变量/静态局部变量/全局变量与静态全局变量
1基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
- c语言静态变量与局部变量,C语言 全局变量、静态全局变量、局部变量、静态局部变量...
//test.c #include extern int global_var; void test_global_var() { global_var++; printf("global_ ...
- C语言全局变量(c文件和h文件中的全局变量、静态全局变量)使用注意事项
C语言在头文件中包含全局变量有三种形式: 1 在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值. 如在main.c定义 int a ...
最新文章
- 我仅使用到的dd if
- 柳传志:联想又遇新坎儿 要做斯巴达克方针
- 实例分析exec函数
- 数据结构之C语言模拟整数数组实现
- c++类与类的泛化(Generalization)关系
- 中国网建SMS短信接口调用(java发送短信)
- java mvc引擎_Velocity是一种Java模版引擎技术,MVC架构的一种实现,但它更多的是关注在Model和View之间,作为它们的桥梁。服务端渲染,我们使用最多的就是用他...
- Linux | 高级I/O函数
- 从日志入手,保障 Kubernetes 稳定性
- 数据库编程连接mysql_使用JDBC编程-连接MySQL数据库
- JS-面向对象--创建具有私有属性的对象(2个方法)
- MyBatis 【返回自增id】
- html基础—页面框架,前端基础——页面架构
- 遗传算法原理和优缺点
- 小皮phpstudy无法启动mysql的解决方法
- linux mint xmind运行,[deepin]安装XMind8并创建运行图标
- linux修改mac地址_如何(以及为什么)在Windows,Linux和Mac上更改您的MAC地址
- 高一计算机精英班班徽,高一8班班徽设计图案素材大全
- ifrme嵌入外部页面,在外部页面调用本页面方法,window.postMessage实现跨域通信
- 只需简单几步 - 开始玩耍微信小程序