作用域:
用通俗易懂的语言来说就是:一个代码中的名字使用是有限定范围的,举个例子:
i是在循环里面定义的,所以他的作用域就是for循环里面,因此,printf作为循环外的操作,这个i是没办法识别的。
生命周期:
生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
1.局部变量的生命周期是:从进入作用域开始,直到作用于生命周期结束。
2.全局变量的生命周期是整个程序的生命周期。
注意:在主函数里面定义的也算局部变量,只有在所有函数之外定义的变量才叫全局变量。
static修饰局部变量:
来比较两组代码的区别以及他的输出结果
第一组很正常,所以输出结果就是五个1
第二组s变量被static修饰,输出结果就变成了12345
所以可以猜测到,static没有销毁这个局部变量s,使得s再下一次循环中直接使用,而不是重新创建。
结论:static修饰的变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是储存在内存的栈区的,但是被static修饰后储存到了静态区,存储在静态区的变量与全局变量是一样的,所以其生命周期就和程序的生命周期一样了。但是这个变量的作用域不变。
除此之外要注意:
static修饰全局变量:
1.首先要知道全局变量是具有外部链接属性的
2.全局变量或者函数被static修饰后,外部链接属性就变成了内部链接属性,不能再跨文件使用了,相当于作用域变小了。
extern:声明外部符号
比如说有些其他文件里面定义了一个全局变量,那你放在另一个文件里面你需要声明一下这个外部符号。
同样的,引用其他文件的自定义函数也是需要申明的,用extern,不过不写在某些编译器里面也不受影响。