C语言中 存在关键字static 顾名思义意思为静态的
那什么是静态的呢?
本文就static的三种用法对static的"静态"做出解释
在msdn中,对static关键字做出了以上解释,但是很难理解,所以接下来我就用代码的方式对static关键字做出解释
static修饰局部变量
static关键字的第一种用法就是修饰局部变量
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int f(int x)
{
int a = 0;//每次调用函数时都在f函数中重新创建a变量
a++;//a变成1
printf("%d\n", a);//打印a=1;
}
int main()
{
int a = 0, i = 0;
for (i = 0; i < 10; i++)//循环调用十次f函数
{
f(a);
}
return 0;
}
//所以程序最后运行的结果为十个1;
如果在f函数中定义a变量时,结果会如何呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int f(int x)
{
static int a = 0;//调用该函数时跳过该语句
a++;//a=a+1;
printf("%d\n", a);//打印a=1;
}
int main()
{
int a = 0, i = 0;
for (i = 0; i < 10; i++)//循环调用十次f函数
{
f(a);
}
return 0;
}
先看结果
我们发现竟然不是打印十个1,而是从1开始打印到10
为什么会出现这种情况呢?
其实这就是static发挥的作用
我们知道,在计算机中,内存可以简单划分为栈区,堆区和静态区,在第一种情况下,在创建a变量时没有加static,所以他被存放在栈区,栈区的特点是在函数执行完之后,创建该变量时创建的空间就被释放了,所以每次进入f函数都会重新创建a变量,所以打印十个1.
而第二种情况,在第一次进入f函数时,创建变量a时用static修饰,使得变量a被存放在内存中的静态区,而静态区的特点是在****程序结束后该变量所占用的内存才释放,所以在出f函数时,a变量并没有被销毁,而是保存下来,在下一次调用f函数时,不会再创建a变量,而是跳过执行之后的语句。
这就是static修饰局部变量时造成的效果
static修饰全局变量
第二种是static修饰全局变量
话不多说先上代码。
在这里我在同一个项目中创建了两个.c文件一个test.c一个test2.c;
我在test2.c文件中创建了全局变量a,我们知道全局变量的作用范围是整个项目
所以我在test.c中声明了a之后就可以调用a,可以打印出来10;
如果我在a变量前用static修饰呢?
话不多说,直接上代码
我们发现代码竟然报错了 报错信息是无法解析的外部符号
说明即使在test.c文件中声明了a,还是无法使用
这就是static修饰全局变量的效果
之所以会出现这种情况,是因为全局变量a在经过static修饰后成为静态全局变量
静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
所以无法调用,这就是static修饰全局变量
static修饰函数
第三种是static修饰函数,其实static修饰函数和修饰局部变量的用法基本相同
还是相同的情况
直接上代码
还是在同一个项目中创建两个文件一个test.c 一个test2.c;
我们在test2.c中定义了一个print函数,在test.c中声明后调用可以正常运行
那我们用static修饰print函数后还会打印出来a的值吗?
可以看到,在定义函数前用static关键字修饰,编译器报错,报错原因是无法解析的外部符号.
所以我们知道,在test.c文件中没有传入test2.c文件的函数print
原因很简单,其实我们发现和static修饰全局变量的形式十分相似,所以原因也和static修饰局部变量相同.
到这里我们对static的用法已经有了充分了解
希望我的博客能对你的学习有所帮助,如果有错误欢迎积极指出。
所用编译器 VS2022