首先,来介绍一点背景知识:
计算机内存就是一块存储空间,C语言在内存中进行存储时,内存会被划分成几个不同的功能区域:
①栈区,主要存储的是局部变量以及一些函数的参数。
②堆区,主要是存放我们动态创建的对象,动态申请的临时空间等等。在这里,malloc,free,calloc,realloc这样的函数是比较常见的。
③静态区,又叫全局区,主要以存储全局变量和静态变量为主。
④常量区,一般常量和字符串就是在这里存储。
C语言中,讲究见名知义。关键字static翻译过来就是“静态的”的意思。它在C语言中的作用就主要有下面3个方面:
- 修饰局部变量
来看一段代码
#include <stdio.h>
int test()
{
int m = 1;
m++;
printf("%d ", m);
return 0;
}
int main()
{
int a = 0;
for (a = 0; a <= 5; a++)
test();
return 0;
}
在不使用static修饰的情况下,它的运行结果是这样的
2 2 2 2 2 2
而在使用了static关键字的情况下
#include <stdio.h>
int test()
{
static int m = 1;
m++;
printf("%d ", m);
return 0;
}
int main()
{
int a = 0;
for (a = 0; a <= 5; a++)
test();
return 0;
}
它的运行结果是这样的
2 3 4 5 6 7
对比两次的代码及其运行结果,可以发现static的使用使得局部变量即使出了它的作用域也没有被销毁。实际上,这是因为static修饰局部变量改变了变量的存储类型(栈区存储->静态存储),相对于是改变了它的生命周期。
- 修饰全局变量
test1和test2是同一工程下两个不同的源文件,m在test2中是一个全局变量,在使用其他文件的全局变量时,首先要进行声明,这里使用extern 来声明m这个外部符号。
运行程序,产生错误:
test1.obj : error LNK2001: 无法解析的外部符号 _m
而当不使用static修饰时,程序可以正确运行。这是因为全局变量在整个工程的其他源文件内部可以被使用,就是由于它是具有外部链接属性的。可是,当全局变量被static修饰时,它的外部链接属性就变成了内部链接属性,使得它只能在自己所在的源文件内部使用,可以看做是其作用域变小了
- 修饰函数
static修饰函数,实际与修饰全局变量基本一致。函数同样具有外部链接属性,当被static修饰时,就具有了内部链接属性,也就只能在自己的源文件内部使用。