用static语句用来修饰 局部变量、全局变量 和 函数
1、static修饰局部变量
static修饰 局部变量,便将该变量定义为 静态局部变量,并将其储存在 静态区
(1)栈区、堆区 和 静态区
- 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
- 全局数据区可分为三部分:栈区、堆区、静态区
- 栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数执行完后就释放了,其操作方式类似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,但是分配的内存量有限。
- 堆区:就是通过new、malloc、realloc分配的内存块,编译器不会负责它们的释放工作,需要用程序区释放。分配方式类似于数据结构中的链表。“内存泄漏 ”通常说的就是堆区。
- 静态区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。
(2)区别
- 栈区内存由系统自动分配,函数结束时释放。
- 栈区是一块连续的内存的区域,速度较快,效率较高。
- 栈区存放的是 局部变量,基础数据类型的值以及基础数据的引用。
-
堆区内存由程序员自己申请,并指明大小。
-
堆区是是不连续的内存区域,动态分配空间,存储空间大一些,可以说是动态内存管理。
-
指针本身存在调用栈中,而指针指的数据在堆中。
-
在静态区中全局变量和静态变量被分配到这一块内存中。
-
在静态区的变量出其作用域并不会被销毁,而是整个程序结束后才被削会。
(3)

- 这里是整形变量b未被static 修饰的结果:1 1 1 1 1 1 1 1 1 1 1。
- 每一次随函数的开始而开始,一旦函数结束,那么,变量b 中的数据也会被销毁。
- 而一旦用static修饰变量b,那么,变量b 中的数据就不会被销毁,会被保留在静态区中。
- 而其保留的值会被输入while语句中去执行,其结果:1 2 3 4 5 6 7 8 9 10 11
2、本质上是static开辟了一块静态区储存区域,将变量转移至静态区,扩大其作用域
相当于一个全局变量(具有了全局变量的属性)
static影响了变量的生命周期。