static字面上的意思就是静态的,在C语言中作为关键字存在。
1. static 修饰局部变量
- 在没有static 修饰p的情况下,p作为test函数的局部变量,进入test函数就创建,退出test函数就销毁,因此每次进入test都会重新执行int p = 0;并且p++,所以最终结果为五个1。
- 在有static 修饰p的情况下,此时p就是静态的局部变量,只有循环的第一次会执行int p = 0;,往后的循环会自动跳过int p = 0;,并且退出test函数之后依然不会销毁,会一直存在于内存之中。第一次循环p为1,退出test函数之后不销毁,第二次循环时p仍然保留着第一次循环的值1,此时再次执行p++即第二次循环为2,往后同理。
可以简单理解为:static修饰局部变量时,局部变量的生命周期变长了,但是作用域仍然不变,只能在局部范围内使用。
2. static 修饰全局变量
因为全局变量是具有外部链接属性的,这种属性决定了全局变量可以在多个文件之间相互使用,使用方法是通过extern关键字来声明外部文件的全局变量。
而在使用static修饰全局变量之后,将全局变量test的外部链接属性变成了内部链接属性,使得test只能在当前.c文件内部使用,不能在其他.c文件中使用了,因此会报错。
可以简单理解为:static修饰全局变量时,全局变量的作用域缩小了,只能够在当前.c文件内使用。当需要全局变量不被其他文件使用时,可以使用static限制其作用域,减少数据污染。
3. static 修饰函数
在理解了static修饰全局变量后,修饰函数就非常好理解。
函数也是具有外部链接属性的,决定了函数可以被多个文件使用,使用方法依然是extern关键字修饰。
同理,当static修饰函数时,函数的外部连接属性也被改变成内部链接属性,此时test1.c将无法找到Add()函数。
可以简单理解为:static修饰函数时,函数的作用域缩小了,只能够在当前.c文件内使用。当不需要其他文件使用到该函数时,可以用static进行限制。