static修饰局部变量
比如下面的代码1:
#include<stdio.h>
void test()
{
int i=0;
i++;
printf("%d ",i);
}
int main()
{
int i=0;
for(i=0;i<5;i++)
{
test();
}
return 0;
}
上面代码走完,打印为:1 1 1 1 1
下面一段代码2:
#include<stdio.h>
void test()
{
static int i=0;
i++;
printf("%d ",i);
}
int main()
{
int i=0;
for(i=0;i<5;i++)
{
test();
}
return 0;
}
这代码2和代码1相比,就是图中的蓝色部分变了,在int i之前加了static,这就使得i好像有了记忆功能,当main函数走第二遍的时候,进入test里面,此时的i不在被赋值为0,而是记住了上次的那个数1,所以这个带有static修饰的代码打印结果为:1 2 3 4 5
static修饰全局变量
先看一个代码3:
//test1.c 在test1这个源文件中
int pos=666;
//test2.c 在test2这个源文件中
int main()
{
printf("%d\n",pos);
return 0;
}
这段代码的运行结果是:666
再看下面一段代码4:
//test1.c 在test1这个源文件中
static int pos=666;
//test2.c 在test2这个源文件中
int main()
{
printf("%d\n",pos);
return 0;
}
这代码4和上一段代码3只是图中绿色部分不一样,有个全局变量pos被static修饰了,代码4在编译的时候会出现连接性错误,因为被static修饰的全局变量只能在本源文件中使用,就是说,代码4中的被static修饰的全局变量pos是在文档test1.c 中,而执行的打印是在test2.c 中,不是同一个源文件,所以会出错。
总结:
static修饰局部变量时,使得局部变量有了“记忆功能”,会记下上个循环的值,比如上面代码2中的i。
static修饰全局变量时,使得全局变量只能在本源文件内使用,不能在另一个文件中使用,比如上面的代码4。