C语言中static是一个较为重要的关键字。接下来我将从static的修饰的对象,作用来介绍static关键字。
static修饰的对象
- 局部变量
- 全局变量
- 函数
static 的作用
1.static修饰局部变量
static修饰局部变量时,其作用是将该局部变量在离开该局部变量的作用域时,阻止该局部变量将其所占的内存空间还给系统。接下来就请看下面这两串代码。
对于第一段代码,fun函数总共被调用了5次,每一次对fun函数调用完之后,变量a的值就会被销毁一次,即当a出了fun函数这个作用域时,变量a就会将a所占用的内存重新还给系统。因此在每次重新调用fun函数时,a都会被重新创建(即a是不同的a),所以a的初始值总是为5,++a后其值变为6,所以每次打印的值都为6.
而在第二段代码中变量a前面被static所修饰,因此在每一次fun函数被调用完之后,a出了作用域之后其并没有被销毁,其所占的内存仍然存在(即a是同一个a),因此,每一次调用fun函数时a的值 都是前一次fun函数结束时a的值。所以打印的数值为“6 7 8 9 10”。简单来说,static修饰局部变量时,延长了其生命周期,使局部变量直到程序结束才会销毁(但并未改变局部变量的作用域)。
从内存上来看:计算机内存大致分为三部分:栈区,堆区,静态区。
栈区:局部变量,形式参数... |
堆区:malloc,calloc,realloc... |
静态区:全局变量,静态变量... |
其中临时作用的变量都是在栈区,其特点就是变量在进入作用域时创建,离开作用域时就会销毁(即将所占内存还给操作系统)。而全局变量等生命周期长的变量存放在静态区内,其特点就是变量创建好之后,直到程序结束才会被销毁。因此,被static修饰的局部变量就会成为静态变量,从栈区中拿出来放在静态区
2.static修饰全局变量
static修饰全局变量时,该变量也可叫做静态全局变量。
如当我们在同一个文件下创建多个源文件时, 因为全局变量具有外部链接属性,所以全局变量可以通过extern这一声明外部符号在不同的源文件中使用。例如下面这一代码图:
但是,当全局变量被static修饰时,该全局变量的外部链接属性就被改变成了内部链接属性,就只能在其所在的源文件中使用。因此全局变量的作用域变小了,但并未改变它的存储位置(始终都在静态区内)。列如下面这一代码图
3.static修饰函数
static修饰函数与static修饰全局变量的作用非常相似,都是使其修饰的变量与函数只能在其所在的源文件中使用。多说无益,直接给大家上图:
重点:
- static修饰的全局变量虽然该变量其生命周期,却并未改变其作用域,这是与全局变量最本质的区别。
- static修饰全局变量时只是改变了它的外部链接属性,并没有改变它在系统中的存储位置,其存储位置始终都在静态区内。
- 当用static修饰了全局变量和函数后,其他文件里再定义同名的全局变量和函数也是可以的。且互不影响。
最后,若在此文章中发现错误,请尽情指出并见谅。