最近学习到了关键字static,发现它的用法特别多,而且很容易弄混淆。所以今天来列出我所了解到关于关键字static的知识,巩固自身的同时希望也能帮到你。
讲static的功能之前咱们先要了解,计算机是如何存储我们代码中声明的变量。都知道我们代码中不管是声明变量还是开辟空间都是在内存中实现的。那么它们是一股脑的全塞在内存中吗,内存里面会不会划分区域来管理它们。实际上内存里面区域的管理分为三个部分:1.栈区 2.堆区 3.静态区 。它们分别存储着局部变量,形参;动态分配的内存;静态变量(也就是static修饰的变量)全局变量;大概如图所示:
了解完这个后,可以更容易理解关键字static。下面说static的具体用处。
static的作用是什么呢?
1. 修饰局部变量
2. 修饰全局变量
3. 修饰函数
1.修饰局部变量
咱们先来看代码,你也可以试试看看这串代码输出的结果是不是跟你想的一样。
void test()
{
static int a = 1;//静态变量
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
运行结果:
是不是有点意外,为什么不是全部都是2。函数定义的局部变量不应该出了函数就销毁吗?其实这就是关键字static的作用。
一个普通的局部变量是放在栈区的,而被static的修饰的局部变量,是放在内存的静态区的存储位置发生了变化,使得局部变量出了作用域不会销毁,影响了变量的生命周期作用域不受影响。
2. 修饰全局变量
同样还是先看代码
static int g_val = 2023;
//声明外部符号
extern int g_val;
int main()
{
printf("%d\n", g_val);
return 0;
}
运行结果:
这时候无法再运用到其他.c文件中定义的全局变量了。
一个全局变量在整个工程中都可以使用的!
全局变量是具有外部链接属性的,在其他源文件内部只要适当地声明就可以使用
static修饰全局变量这时全局变量的外部链接属性就变成了内部链接属性,只能在自己所在的.c文件内部使用,其他.c文件无法使用
影响了,变量的作用域。
3. 修饰函数
还是先看代码
外部函数:
static int Add(int x, int y)
{
return x + y;
}
extern int Add(int, int);
int main()
{
int a = 10;
int b = 20;
int sum = Add(a, b);
printf("%d\n", sum);
return 0;
}
运行结果:
由此可见的效果是跟修饰全局变量是差不多的,都是无法使用了。
函数是具有外部链接属性的
static 修饰函数 后,函数的外部链接属性就变成了内部链接属性
被static修饰的函数只能在自己所在的.c文件内使用,其他.c文件无法使用
最终相当于影响了作用域
这些就是我最近学到的有关关键字static的知识了,希望对你也有帮助。