1、static 关键字

C 语言中 static 关键字修饰变量和函数

static有三种不同的用法:

1.修饰局部变量;

2.修饰全局变量;

3.修饰函数

局部变量:当函数第一被调用,函数中的静态局部变量被初始化,再次调用这个函数,这个 static 变量也不会再次被初始化,仍是保存的前一次函数调用时的结果。 (作用域不变,生存期改变)

全局变量: static 说明的全局变量只可以在当前 c 程序文件中使用(作用域收到限制,生存期不变)。函数: static说明的函数只可以在当前 c 程序文件中使用 (作用域收到限制,生存期不变)。

全局变量:定义在函数外部的变量 (尽量少用,不安全)
局部变量:定义在函数内部的变量,包括形参
链接属性:针对多文件,一个文件的符号(变量,函数)是否可以被其它文件所见
头文件:存放函数的声明
源文件:存放函数的实现

2、局部变量介绍:

示例1:

运行结果:

示例2:

#includevoid Fun(){static int a = 0;//第一次定义时执行,以后再来时不执行,考试重点a++;printf("%d\n",a);}int main(){//int a =10;//printf("%d\n",a);for(int i=0;i<10;i++){Fun();}return 0;}

运行结果:

局部变量的生命周期就是其所在的那个局部范围,简单来说就是进这个范围变量就创建,出这个范围变量就销毁。

因为static修饰的变量在一个程序只会执行一次,之后就不会发生改变了。本质上是因为static修饰的局部变量存储位置改变了,局部变量是存储在栈区内,而静态变量则是存储在静态区内。而这种改变带来的影响就是使得局部变量的生命周期变得和整个程序一样长,即:局部变量出了其作用域也将不会销毁,除非程序结束。值得注意的是虽然局部变量的声明周期得到了很大的提升,但他的作用域没有发生任何的改变,还是只能在那个局部的范围内使用。

内存大致上被划分为三个区域:栈区,堆区,静态区。

3、全局变量介绍:

全局变量在不同的源文件中是可以使用的,只不过需要先用extern外部声明一下。

#include//全局变量介绍int g_a = 10;//全局变量,从定义开始直到文件结尾都能使用int g_b;//全局变量未初始化,系统自动初始化为0//extern intg_c;//引用外部符号//extern int g_d;void Fun(){printf("%d\n",g_a);}int main(){printf("%d\n",g_a);Fun();printf("%d\n",g_b);//printf("%d\n",g_c);//printf("%d\n",g_d);return 0;}

运行结果如下:

全局变量是具有外部链接属性的,而static修饰的全局变量的时候就把这个外部链接属性变成了内部链接属性

4、总结

局部变量被static修饰时生命周期将变得和整个程序一样长,但作用域并没有变化。而static修饰全局变量和函数时,就只能在该源文件内部使用,将于外部隔绝起来。