本文整理于多个博客如https://blog.csdn.net/weixin_43222324/article/details/106989714
首先,对比这些变量的不同,最重要的是两个方面,一个是作用域一个是生命周期。
静态变量和动态变量对比
静态变量和动态变量(自动变量)---是从变量的内存分配的角度(生命周期)划分。
- 静态变量:
- 存在静态存储区,分配一次空间,在程序的整个运行期间内都不释放空间。
- 编译时赋初始值,只赋一次初值,在以后每次调用函数时,都不再重新为其赋值,只是使用上一次函数被调用结束时变量的值。
- 未赋初值的话,编译器给赋值为0.
- 动态变量(自动变量):
- 存在动态存储区(栈)上,即局部变量,函数调用结束后存储单元即被释放。
- 而自动局部变量的初值不是在编译时赋予的,而是在函数调用时赋予的,每调用一次,函数都对变量重新赋一次初值。
- 如果不赋值,则变量的值是一个不确定的值。
全局变量和局部变量对比
全局变量和局部变量---是从变量的作用域的角度划分。
-
全局变量(外部变量):
- 作用域为整个工程
- 存储在静态存储区(这点与静态变量相同)
- 此处引入外部变量(extern关键字):extern主要针对具有多个源文件的项目。如果有多个源文件需要使用到相同的全局变量,则这些变量只需要在其中的某一个源文件中定义一次,其它的源文件如果想使用这些外部变量,需要在声明的时候前面加上"extern"。
-
局部变量:
- 作用域为当前程序块
- 存储在栈区(非静态局部变量就是自动变量)
优先使用局部变量再使用全局变量:局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。
静态局部变量和静态全局变量
静态全局变量
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。并不是说全局变量在定义时加了static关键字才是静态存储,不加static就是动态存储,不是的。不管加不加static,全局变量都是存储在静态存储区的,都是在编译时分配存储空间的,两者只是作用域不同,全局变量默认具有外部链接性,作用域是整个工程,全局静态变量的作用域仅限本文件,不能在其他文件中引用。静态局部变量
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。但是作用域还是在原来的函数体内可以使用
总结:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
最后总结一个表格