作者:黄忠老师(张飞实战
电子高级工程师)
不要从字面意思误以为关键字sta
tic很安静,其实它一点都不安静。这个关键字在C语言里主要有两个作用,下面我们就来介绍一下C语言关键字static的作用,你是否理解全了呢?是否会用了呢?一起来看下吧。
一、修饰变量第一个作用修饰变量,变量又分为局部变量和全局变量,但它们都存在内存的静态区。
对于静态区,堆栈等等这些区域的概念大家是不是也容易混淆的呢,后续篇章我来整理给大家看下,有兴趣的可以关注下啊~
静态全局变量:作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法使用。准确的说:作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码也不能调用,想要调用只能在文件前面做出声明。是不是很麻烦,要想不麻烦,那就乖乖地把变量定义在文件顶端吧,就不用声明了,作用于整个文件内。
静态局部变量:
作用域:静态局部变量在函数体里面定义的,就只能在这个函数里用了,同一个文件中其他函数是用不了的,同其他局部变量作用域一样的。
生存期:由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍然能用到这个值。也就是说有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这个变量占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值,这样定义的局部变量为“静态局部变量”。也就是说增加了变量的生存期。一般局部变量调用完就自动释放(比如auto变量)。这个增加生存期就是定义静态局部变量的主要作用了。
对于静态局部变量还需要注意以下几点:
1、对静态局部变量在编译时赋初值,也就是说只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
2、如果静态局部变量没赋初值,则在编译时自动赋初值0(数值型变量)或空字符(字符型变量)。
3、这个由于是局部变量,作用域仍然只能函数内用。不能被其他函数引用。
4、多次调用函数,局部变量需要必须用前一次值的情况定义为静态局部变量,否则占用内存,可读性差,不要多定义。
我们举例说明下什么情况下需要定义静态局部变量,比如一个压力开关量,我在压力上升为5帕时定义为开,回落为3帕时再关掉;这时判断压力值的函数中,上一次的状态就需要在函数内定义为静态局部变量,当每次进入时都需要在上次的状态下判断得出结果。当然这种情况大家认为定义一个全局变量就可以了啊,如果其他函数或者文件不需要用到这个变量,那么定义局部变量定义是不是就很合适了呢?还是要根据实际需要来定义合适的变量最好。
二、修饰函数第二个作用就是修饰函数。
静态函数:函数前加上static使得函数成为静态函数,但是此处的static的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。(又成为内部函数);
使用内部函数的好处是,不同的人编写不同的函数时,不用担心自己定义的函数是否会与其他文件中的函数同名。
总而言之对于修饰函数主要也是对函数的作用域做了限制,跟静态全局变量类似,比如这个被static修饰了的函数前面调用也是需要声明才能使用的。
其实关键字static有着不同寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量,也就是开始就是我了修饰静态局部变量而存在的。随后,在C中有了第2种含义,用来表示不能被其他文件访问的全局变量和函数。其实是为了避免引入新的关键字,所以还是用static关键字来表示这两种含义。
对于static关键字在编程中的用途和规则大家有没有理清楚呢。守规则最终结果才会跟你的想法一致啊。