前言
本文章简要介绍c语言中static的三种用法
一、修饰局部变量
在主函数中即 int main()中创建变量时,在前面加上static,就使用了static修饰局部变量。
局部变量具有的特点:在程序进入作用域内创建(开辟一块新的内存空间),在程序离开作用域后销毁(删除内存空间),可以在VS编译器中查看:
如图一个简单的for循环中,一个循环就是局部变量a的一个生命周期,按F11后,按如下步骤
调试—>窗口—>监视,打开监视窗口
如图输入监视内容: a —>对应a的值 &a—>对应a的地址
再次按 F11逐条运行程序,发现每次循环&a对应的值,也就是a的存放地址都改变了。
而在static修饰了之后,重复上述步骤,将发现&a的值不再改变。
其实static将局部变量默认的存放路径栈区,变为静态区,使得变量的作用域变得和程序的一样长,程序销毁才会销毁,并且值得一提的是,static int a=1;这一条语句在整个程序中只会执行一次,我们在循环后面加两条语句来测试一下:
每条循环语句中都有static int a=10; 但是并没有每次都将a初始化为10,其实正是因为a的地址一直存在,而且程序只会执行一次此语句,不会再进行删除和开辟新内存的操作。
所以static修饰局部变量具有延长局部变量生命周期的作用。
二、static修饰全局变量
在主函数int main()外部定义的变量称为全局变量,在主函数外加一句 extern int a;就可以使用同一个工程,不同源文件的全局变量。而使用static修饰的全局变量,将使得本条属性丢失。
如图未使用static时程序完美运行。
而加上static后报错:
报错内容为无法解析外部符号a,即不能再使用,另一个源文件的全局变量。
原理其实很简单,全局变量拥有外部链接属性,即为能被另一个源文件引用的原因,但是static将局部变量的外部链接属性变为内部链接属性,不再具有被其他源文件引用的属性。
注:意义在于:
1.避免不同源文件中对变量重命名
2.防止其他源文件随意修改参数,保证一定安全性。
三、修饰函数
与全局变量类似,可以用extern声明其他源文件的函数:
而在static修饰函数之后,同样出现报错
报错内容为未识别Add,和全局变量未识别非常类似。原理也同上,原本函数具有外部链接属性,static修饰之后变为内部链接属性。
总结
1.static修饰局部变量,延长了变量的生命周期,并且变量的地址将一直存在并保持不变。
2.static修饰全局变量,使得其他源文件不能引用此全局变量。
3.static修饰函数,使得其他源文件不能引用此函数。