一.static的介绍
static是一种修饰符,可以用来修饰局部变量,全局变量和函数,被static修饰后,其存储类型会发生改变,从栈区存储到静态区。
首先我们需要知道,在C/C艹中,将内存分成三个区域:
二.static修饰的使用
1.修饰局部变量时
将原本是在栈区的变量,改变其存储类型,使其成为静态变量。
我们先观察一段代码:
#include<stdio.h>
void test()
{
int z = 0;
z++;
printf("%d ", z);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
用while循环调用test函数,test函数内创建了局部变量z并使其每次调用后都+1。
而test局部变量z每次调用后都会重新创建并且销毁,所以这段代码结果应该是:
但是,当我们用static函数修饰函数test内的局部变量int z后
此时输出结果却变成了:
原因是:int z被static修饰后,变量z已经从临时变量变为静态变量,程序在刚开始编译时int z就已经被创建,并且在每次while循环后int z不会再重新初始化,每次循环结束时int z也不会被销毁,只有在整个程序结束时才销毁。所以当进入下回循环时,z还是上一次已经被+1后的z。不过需要注意的是,与全局变量不同,虽然其生命周期变长了,但是作用域并不改变。
2.修饰全局变量时
首先,全局变量具有外部链接属性,所以在其他源文件中也可以使用。
所以同一个项目下不同文件都可以使用,只不过需要用extern声明。
代码说明:在 test.c 文件下输出在 源.c文件中创建的全局变量g_val,并未用extern声明
此时报错 g_val未定义。
用extern去声明该全局变量:
结果自然就为2023。
既然没什么问题了,我们就加入static修饰吧,看看用static修饰add.c中的全局变量g_val,会发生什么。
又开始报错未定义无法解析了。
可以看出,使用extern后,全局变量g_val只能在源文件内部使用,无法在其他文件使用。
使其从外部链接,属性改变为内部链接属性。(此做法可用于隐藏,不必因为不同文件之间的同一命名冲突。
3.修饰函数时
用static修饰函数,函数会被定义成为静态函数。
与全局变量相似,都改变其作用域,使其无法被extern声明。
使用上:
总结:一.对全局变量和函数具有隐藏功能,可以免受同命名冲突。
二.对局部变量会改变其存储类型,使其作用域更长。
三.因为其存放在静态区,局部变量和全局变量都默认初始化为0。