c语言中static的应用

一.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修饰后,外部链接属性就变成了内部链接属性,这时这个函数只能在自己所在的源文件内部使用,其他文件无法使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值