#include
void test() { int i = 0; i ; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i ) { test(); } return 0; } 调用十次test函数,每次调用时i都要重新初始化,因为上一次结束后i值已经销毁,因此打印10次1.
接下来用static来修饰局部变量i:
#include
void test() { static int i = 0; //修饰局部变量 i ; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i ) { test(); } return 0; } 输出就由10个1变成1-10,原因时当函数调用完后i值不销毁,再次调用test时直接i=i 1,打印十次为1 2 3 4 5 6 7 8 9 10.
结论:static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束, 生命周期才结束。
在一个源文件内定义全局变量
在另一个源文件内用extern声明引用此全局变量:
打印成功
在全局变量前用static修饰:
再次重复打印步骤:
发生错误
结论:一个全局变量被static修饰,改变了变量的作用域-让静态的全局变量只能在自己所在的源文件内部使用,生命周期不变。
在一个源文件内定义加法函数:
另一个源文件里使用:
成功打印
用static修饰加法函数:
再次打印:
发生错误。
结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
static修饰全局变量与函数作用相同,因为未加static时全局变量与函数都具有外部链接属性,使他们在其他源文件内用extern声明后即可使用。使用static后,全局变量与函数的外部链接属性->内部链接属性,让他们无视了extern的作用,只能在他们所在的源文件内使用。