首先介绍static关键字
static翻译成汉语是:静止的;不变的,在C语言中主要有三个作用
1.static修饰局部变量
static修饰局部变量的作用是是数据保持的更久一些,同时static修饰的局部变量的存储区是在静态存储区的,被static修饰的变量可以称之为静态变量,若在定义是不显示的对它进行初始化,则编译器会对它隐式的初始化为0(全局变量也是相同的),它的生命周期是从定义开始处一直到程序运行结束,比如说下面的程序:
<span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
int main()
{
static int a; //声明静态变量a没有显示的初始化 所以编译器会隐式的初始化为0
static int b = 10; //声明静态变量b,它和a一样在静态存储区存储,生命周期在程序结束处
int c = 20; //普通变量 执行到这一步才会在栈区开辟空间进行初始化
printf("a=%d\nb=%d\nc=%d\n", a, b, c);
system("pause");
return 0;
}</span>
程序运行结果是:
2.static修饰全局变量
3.static修饰函数
static修饰全局变量和函数的时候的作用是一致的,就是修改连接属性,对于全局部变量和函数的声明默认的是具有外部连接属性的,就是通过extern关键字可以在别的文件中使用,但是如果static修饰了全局变量或者函数,那么它的连接属性就会变为内部连接属性,即就是只能在本源文件中使用,别的源文件不能使用它们。举个例子
#include<stdio.h>
#include<stdlib.h>
static int d = 10; //声明全局静态变量
int e = 10;
static void fun1() //函数用static修饰
{
printf("this is an example\n");
}
void fun2()
{
;
}
int main()
{
return 0;
}
现在有一个源文件是a.c其中声明了静态全局变量 static int d=10和static修饰的函数fun1(),如果想在另一个源文件中b.c使用,通过extern是不能办到的,因为它的连接属性已经被修改为内部链接属性。但是在b.c中可以在通过
extern int e = 10;
extern void fun2();
在b.c中就可以使用它们了,因为它们的连接属性是外部的。