全局变量和静态变量的区别:
!全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;
静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回
后,该变量不会消失;普通局部变量在定义它的函数内有效,但是函数返回后
失效。普通全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变
量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别虽在于普通全局变量的作用域是
整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源
文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的
源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量
的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免
在其它源文件中引起错误。
!也能这么看:
!A.若全局变量仅在单个文件中访问,则可以将这个变量修改为静态全局变量,
以降低模块间的耦合度;
!B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变
量,以降低模块间的耦合度;
!设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要
考虑重入问题:
!D.如果我们需要一个可重入的函数,那么我们一定要避免函数中使用 static 变
量(这样的函数被称为:带“内部存储器”功能的函数)
!E.函数中必须要使用 static 变量情况:比如当某函数的返回值为指针类型时,则
必须是 static 的局部变量的地址作为返回值,若为 auto 类型,则返回为错指针。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即
改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制
了它的使用范围。因此 static 这个说明符在不同的地方所起的作用是不同的。
应予以注意。
变量的 6 种作用:全局作用域,文件作用域,命名空间作用域,类作用域,局
部作用域,语句作用域。
附:static 有着不寻常的历史:起初,在 C 中引入关键字 static 是为了表示退出
一个块后仍然存在的局部变量。随后,static 在 C 中有了第二种含义:用来表
示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍
使用 static 关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋
予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对
象的变量和函数(与 Java 中此关键字的含义相同)。
一,jvm 核心编程中的内存分析