目录
前言
static英文含义静态的,静止的。static可以修饰变量和函数。
一、修饰变量
1.修饰局部变量
void Addself()
{
int tmp = 0;
tmp += 1;
printf("%d", tmp);
}
int main()
{
for (int i = 1; i <= 3; i++)
{
Addself();
}
}
输出结果为111
那么我们给临时变量加上static后再来看一下结果
void Addself()
{
static int tmp = 0;
tmp += 1;
printf("%d", tmp);
}
int main()
{
for (int i = 1; i <= 3; i++)
{
Addself();
}
}
结果为123
临时变量在函数结束时本应该自动销毁,但上述情况来看,在我们加上static后,它没有被销毁,反而作为下一次继续使用,顾名思义,改变了他的生命周期。
注:static 修饰局部变量的时候,其实改变的是局部变量的存储位置,原来的局部变量放在栈区,静态的局部变量是放在静态区,放在静态区的变量出了作用域是不会销毁的,相当于生命周期延长了。
当然关于静态地址空间,我们现在简单了解就可,它分为栈区,堆区以及静态区。
1.我们的局部变量和形参以及所有的函数都放在栈区;
2.堆区存放的是动态开辟的内存;
3.静态区存放的就是全局变量,或者static修饰的变量
2.修饰全局变量
我们知道全局变量的作用域是整个工程,辩证法可知我们要想看到区别需放在不同的文件里
int num=2022;//创建全局变量
extern num;//extern引用全局变量
int main()
{
printf("%d", num);
return 0;
}
输出结果为2022
当我们用static修饰后
static int num=2022;
我们发现编译器报错(一个无法解析的外部命令),也就是说全局变量的外部链接属性变成了内部链接属性,其他源文件无法使用了
二、修饰函数
修饰函数与修饰全局变量的作用是相同的,同样的只能在本文件内使用,不能共享于工程内其它源文件
总结
1. 在修饰局部变量时, static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。Static修饰的局部变量存放在全局数据区的静态变量区。
2. static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
3. static修饰一个函数,则这个函数的也只能在本文件中调用,不能被其他文件调用。