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