概述
C语言中提供了丰富的关键字,这些关键字是预先设定好的,用户不能自己创建,并且不能将关键字作为变量名使用,接下来我将用一个短视频的时间带大家掌握static关键字的用法。
目录
1、static修饰局部变量
我们知道,局部变量的作用域是局部变量所在的局部范围,即函数体内,它的生命周期是在函数体内定义一个局部变量后直到该函数体结束运行。
我们来看下面这段代码:
void test()
{
int a=5;
a++;
printf("%d",a);
}
int main()
{
int i=0;
//我们让程序循环5次
while(i<5)
{
test();
i++;
}
return 0;
}
代码的运行结果:
原因很简单,在5次while循环中每次调用test函数,a都经历了创建与销毁,即定义int a=5创建到test函数结束销毁(空间还给操作系统),每次a一开始的值都是5,执行a++后在控制台上打印,结果是5个“6”。
如果我们将"int a=5;"改为"static int a=5":
void test()
{
static int a = 5;
a++;
printf("%d ", a);
}
代码的运行结果:
说明现在这个变量a没有经历test函数调用后销毁的过程, 原因是static修饰后将局部变量a更改为了静态局部变量,a在系统中的存储方式改变了,生命周期也得到了延长,而静态局部变量的销毁(空间还给操作系统)是在整个程序结束之后。
结论:static修饰局部变量,使局部变量转变为静态局部变量,延长了其生命周期,程序结束,静态局部变量才销毁。
2、static修饰全局变量
通常我们可以在同一个源文件下定义全局变量,也可以在另外一个源文件下定义全局变量,那么如何把另外一个源文件的全局变量拿过来用呢,我们要用到extern-声明关键字:
//源文件1.c
int global_value=1;
int main()
{
//```
return 0;
}
//源文件2.c
extern int global_value;
int main()
{
printf("%d",global_value);
return 0;
}
代码运行结果:
用extern关键字进行声明之后,程序在源文件2下编译运行成功并打印在源文件1下定义的全局变量global_value的值。
如果我们在源文件1中将global_value定义为静态全局变量,即
static int global_value=1;
再次在源文件2下编译运行,结果是:
提示这个变量无法解析,说明static修饰的全局变量无法在另外一个源文件里面使用,即更改全局变量的外部链接属性为内部链接属性。
结论:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
3、static修饰函数
static修饰函数以及static修饰全局变量,是一个性质,直接上两种情况的代码以及运行结果:
第一种,add加法函数没有用static修饰
//源文件1
int add(int x, int y)
{
return (x + y);
}
//源文件2
extern int add(int x,int y);
int main()
{
int c = add(1, 2);
printf("%d", c);
return 0;
}
第二种,add加法函数被static修饰
结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。