C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别

全局变量、局部变量、静态全局变量、静态局部变量的区别函数

C++变量根据定义的位置的不一样的生命周期,具备不一样的做用域,做用域可分为6种:全局做用域,局部做用域,语句做用域,类做用域,命名空间做用域和文件做用域。设计

从做用域看:指针

全局变量具备全局做用域。全局变量只需在一个源文件中定义,就能够做用于全部的源文件。固然,其余不包含全局变量定义的源文件须要用extern 关键字再次声明这个全局变量。对象

静态局部变量具备局部做用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对全部的函数都是可见的,而静态局部变量只对定义本身的函数体始终可见。生命周期

局部变量也只有局部做用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。ip

静态全局变量也具备全局做用域,它与全局变量的区别在于若是程序包含多个文件的话,它做用于定义它的文件里,不能做用到其它文件里,即被static关键字修饰过的变量具备文件做用域。这样即便两个不一样的源文件都定义了相同名字的静态全局变量,它们也是不一样的变量。内存

从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间作用域

 

 

全局变量自己就是静态存储方式, 静态全局变量固然也是静态存储方式。这二者在存储方式上并没有不一样。这二者的区别虽在于非静态全局变量的做用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其做用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。因为静态全局变量的做用域局限于一个源文件内,只能为该源文件内的函数公用,所以能够避免在其它源文件中引发错误。编译器

    1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样能够在下一次调用的时候还能够保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。   2)、变量用static告知编译器,本身仅仅在变量的做用范围内可见。这一点是它与全局变量的区别。编译

从以上分析能够看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的做用域,限制了它的使用范围。所以static 这个说明符在不一样的地方所起的做用是不一样的。应予以注意。

Tips:   A.若全局变量仅在单个C文件中访问,则能够将这个变量修改成静态全局变量,以下降模块间的耦合度;   B.若全局变量仅由单个函数访问,则能够将这个变量改成该函数的静态局部变量,以下降模块间的耦合度;   C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,须要考虑重入问题,由于他们都放在静态数据存储区,全局可见;     D.若是咱们须要一个可重入的函数,那么,咱们必定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)     E.函数中必需要使用static变量状况:好比当某函数的返回值为指针类型时,则必须是static的局部变量的地址做为返回值,若为auto类型,则返回为错指针。

-----------------------------------------------------------------------------------------------------------

static 全局变量:改变做用范围,不改变存储位置

static 局部变量:改变存储位置,不改变做用范围

静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不一样,它只能在声明它的文件当中可见,不能被其它文件使用。

                若是在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字便可。

相关文章
相关标签/搜索