文章目录
static
static中文意思为静态的,其实关键作用就两点
1.static修饰的局部变量会从堆栈区存放在静态区,保持变量内容的持久
代码一
void fun()
{
int i = 0;
i++;
printf("%d",i);
}
int main()
{
for(int i = 0;i<10;i++)
{
fun();
}
return 0;
} //最终代码会打印出来 1 1 1 1 1 1 1 1 1 1
代码二
void fun()
{
static int i = 0;//加入了static
i++;
printf("%d",i);
}
int main()
{
for(int i = 0;i<10;i++)
{
fun();
}
return 0
} //最终代码会打印出来 1 2 3 4 5 6 7 8 9 10
这就是因为代码一,fun()函数中的变量 i (在栈区)随函数入栈出栈,所以每次循环后,再次调用函数, 变量 i 又为0,又从0开始+1;
而在代码二中,fun()函数的变量i用static修饰后,改变了其存储类型,全局区(静态区)保存,函数调用完后出栈,但是变量 i 此时并不会,因为压根不在栈区,所以每次调用函数都在原有基础上+1,
2.static修饰全局变量和修饰函数,将它们的外部链接属性改为内部链接属性(说白了就是只有在自己的文件中使用),不能被外部其他文件直接访问(注意是直接!!!)
//文件1 test.c
#include<stdio.h>
static int g_val = 10;
void show()
{
printf("%d",g_val); //static修饰,可以在自己内部文件的show函数中使用
}
//文件2 main.c
#include<stdio.h>
show()
int main()
{
show(); //这个文件声明了show()函数,调用show函数,相当于间接使用了g_val
}
另外static也有一些其他巧妙的用处
默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00(栈区变量默认以CC填充,堆区变量默认以CD填充)。如初始化一个稀疏矩阵,我们可以通过static把所有元素都置0(而不是用代码一个一个置为0),然后把不是0的几个元素赋值。
一句话总结static:首先 static 的最主要功能是隐藏,其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值0。
730



被折叠的 条评论
为什么被折叠?



