一:什么是static
static意为“静态的”,在我们常见的计算机语言中(如C,C++,Java等,本文只针对C语言)作为关键字和函数出现。
二:static的作用与用法
1、修饰局部变量
2、修饰全局变量
3、修饰函数
在了解之前,我们先得知道C语言分区
下面将配合例子来一同解释
修饰局部变量
上述代码的运行结果为什么是十个1而不是1~10?
由while引导的条件循环语句共执行十次,所以自定义函数test()被调用、执行运算十次。但test()中的变量x是局部变量,每次进入局部范围被创建,出范围被销毁,所以每次执行程序都会有个值为0的临时变量“x“,++后值变成1最后被打印出来。而不是循环十次,x++一直加到10。
但是如果想打印出1~10,怎么办?
只需在定义变量x前加一个“static”修饰局部变量。被修饰后的变量并没有放进“栈区”而是被放进了静态区,放入静态区的数据创建后直到程序结束才释放。此时的临时变量x,不会每次在test()运行完后出作用域而被释放,而是再每次执行函数后保留x++后的数据。
本质上,static的修饰改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。
可以简单的理解为,static改变了局部变量的生命周期
但是static不会改变变量的作用域
x的作用域依然只是在test()自定义函数的大括号里
修饰全局变量
上例子
众所周知,全局变量的作用域很大,大到整个程序,且具有外部链接属性。文件A.c定义了一个全局变量int a;,在文件B.c中可通过声明进行外部引用 extern int a;引用。
如果对全局变量进行修饰,会有什么效果?
此时,全局变量a被static修饰,外部连接属性变成了内部链接属性,这个全局变量只能在自己所在的源文件(例如上图的bianliang.c)内部使用。static改变了全局变量的作用域,使其作用域变小。
修饰函数
咱们来随便写个交换函数
在另一个源文件定义一个自定义函数swap(),通过extern外部引用,这样swap()也可在第一个源文件中被调用。
那么,对函数进行修饰,会怎样?
函数本身具有外部链接属性的,被static修饰之后,外部链接属性就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,其他源文件无法使用,限制了作用域。(情况和static修饰全局变量相似)
三:总结
总的来说,当局部变量被static修饰时它的生命周期会变得和整个程序一样长,但其作用域并没有发生变化。而当static修饰全局变量和函数时,变量/函数只能在该源文件内部使用,外部无法调用。
版权归原作者 八尺兔子 所有, 如有侵权,请联系我们删除。