开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

全局变量与静态全局变量的异同(static与非static)

简介: 全局变量与静态全局变量的异同(static与非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静态成员
普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享。 sizeof运算符不会计算静态成员变量的大小,如下的sizeof(CTest)为4:
15 0
Static Page-静态页面
Static Page:静态页面 一般情况下,我们说一个URL链接对应一个网页。当访问者在任何时间内向那个URL链接发送请求,都返回同样的网页内容。可以认为这样的网页是静态页面。
95 0
iOS中 static变量与全局、局部变量的区别 !
static变量与全局、局部变量的区别全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
1209 0
C# Static
 static静态分配的,有两种情况:   A、 用在类里的属性、方法前面:   这样的静态属性与方法不需要创建实例就能访问,通过类名或对象名都能访问它,静态属性、方法只有“一份”:即如果一个类新建有N个对象,这N 个对象只有同一个静态属性与方法。  B、 方法内部的静态变量:    方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,它不是在栈中分
625 0
C# Static
 static静态分配的,有两种情况:   A、 用在类里的属性、方法前面:   这样的静态属性与方法不需要创建实例就能访问,通过类名或对象名都能访问它,静态属性、方法只有“一份”:即如果一个类新建有N个对象,这N 个对象只有同一个静态属性与方法。  B、 方法内部的静态变量:    方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,它不是在栈中分
931 0
static成员函数
1.static成员函数不能定义为const的,这是因为static成员函数只是全局函数的一个形式上的封装,而且static成员函数不能访问类的非静态成员(没有this)指针,修改非静态数据成员又从何说起呢?还有如果成员函数返回值是个引用的话,则也不能声明为const类型,因为返回引用就意味着你在函数外面可能会修改其指向的内存。
843 0
解决一小问题(static静态变量),仍有问题请教!
        这几天一直在发愁一个小问题利用SWT Designer做的界面,向另一个java类传值,由于负责接受值的方法是带String参数的,所以在其它方法中调用时就会出线问题,一直不知道如何修改,刚看到了一篇文章,讲到了static静态变量,...
682 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载