一.static可以修饰的内容
static可以修饰变量和函数
1.修饰局部变量—称为静态局部变量
2.修饰全局变量—称为静态全局变量
3.修饰函数—称为静态函数
1.static修饰局部变量
例:
void test()
{
int a=5;
a++;
printf("%d ",a);
}
int main()
{
int i=0;
while(i<10)
{
test();
i++;
}
}
结果是6 6 6 6 6 6 6 6 6 6
当static修饰局部变量后
void test()
{
static int a=5;
a++;
printf("%d ",a);
}
int main()
{
int i=0;
while(i<10)
{
test();
i++;
}
return 0;
}
结果是6 7 8 9 10 11 12 13 14 15
原因是static修饰局部变量的时候,局部变量就变成了静态的局部变量,出了局部的范围不会销毁,下一次进入函数依然存在,是因为static修饰的局部变量是存储在静态区的,放在静态区的变量出了作用域是不销毁的。
static修饰局部变量时实际改变的是变量的存储位置,本来一个局部变量是存储在栈区的,被static修饰后放在了静态区,从而导致出了作用域依然存在,生命周期并没有结束。
补充:
在第一个文件中写:
int g_val=2022;(全局变量)
在第二个文件中写:
int main()
{
printf(“%d\n”,g_val);
return 0;
}
结果会报错:g_val是未声明的标识符
应该写为:
extern int g_val;
int main()
{
printf(“%d\n”,g_val);
return 0;
}
extern是用来声明外部符号的
2.static修饰全局变量
第一个文件中写:
static int g_val=2022;(全局变量)
第二个文件中写:
extern int g_val;
int main()
{
printf(“%d\n”,g_val);
return 0;
}
结果会报错:无法解析的外部符号g_val
原因是一个全局变量本来具有外部链接属性,但被static修饰后,外部链接属性就变成了内部链接属性,只能在自己的源文件内部使用,不可以在其他文件内部使用。
对于函数来说同理:
第一个文件:
int Add(int x,int y)
{
int z=x+y;
return z;
}
第二个文件:
int main()
{
int a=10;
int b=20;
int ret=Add(a,b);
printf(“%d\n”,ret);
return 0;
}
结果会提示Add未定义
解决方法是第二个文件开头应加extern int Add(int x,int y);用来声明来自外部的函数
当第一个文件改为:
static int Add(int x,int y)
{
int z=x+y;
return z;
}
结果会报错:无法解析的外部符号Add
原因是一个函数本来是具有外部链接属性的,但被static修饰后,外部链接属性就变成了内部链接属性,这时这个函数只能在自己所在的源文件内部使用,其他文件无法使用。