C语言-static关键字-创新互联
目录
创新互联建站是一家专注于成都做网站、网站设计与策划设计,炎陵网站建设哪家好?创新互联建站做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:炎陵等地区。炎陵做网站价格咨询:18980820575static修饰局部变量
static修饰全局变量
static修饰函数
static关键字既可以修饰变量,也可以修饰函数,那么修饰后与修饰前有什么不同呢?下面分别从这两方面进行讲述。
static修饰局部变量先上结论:static修饰局部变量会更改局部变量的生命周期使其拥有全局生命周期,但作用域并不会改变。
如何去证明它?我们看下面一段代码:
#includevoid fun()
{
int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
for (int i = 0; i< 10; i++)
{
fun();
}
return 0;
}
在没有static修饰变量i时,最后的结果为10个1,因为i在函数内部创建,每次函数调用时创建,函数结束时销毁。当我们加上了static关键字后
#includevoid fun()
{
static int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
for (int i = 0; i< 10; i++)
{
fun();
}
return 0;
}
结果就变成了1到10,static让变量i拥有全局生命周期并且static int i = 0只会执行一次,后面再执行fun函数不会再执行这句话。
那如何证明作用域没有改变呢?
还是上面的变量i,它的作用域是函数体内部,函数体外面是访问不到的,我们可以尝试在main函数中打印变量i
发现不能找到,所以作用域并没有改变。
static修饰全局变量还是先上结论:static修饰的全局变量不能在文件外部访问,把其外部链接属性修改为内部链接属性。
正常情况下,我们在一个文件中定义的全局变量,在另一个文件中声明了即可访问
//我是一号文件
int a = 10;
//我是2号文件
#includeextern int a;
int main()
{
printf("%d", a);
return 0;
}
当我们给1号文件中的变量a加上static修饰后,运行发现2号文件报错
所以static修饰的全局变量不能跨文件访问,但是2号文件就不能访问了吗?
虽然不能直接访问,但是我们可以间接访问
//我是一号文件
int a = 10;
int* p = &a;
void change()
{
a++;
printf("%d", a);
}
//我是2号文件
#includeextern int a;
extern int* p;
int main()
{
(*p)++;
printf("%d\n", *p);
change();
return 0;
}
最后打印的结果为11和12
static修饰函数先上结论:static修饰函数会减少函数的作用域,使函数只能在本文件中访问
正常情况下,函数即使不声明也可以在别的文件中访问,就如同上面的嫦娥函数,我并没有声明,依然可以访问。
还是上面的代码,我们给change函数前面添加static关键字后,发现编译器就会报错
但它与static修饰的全局变量一样,虽然无法直接访问,却可以通过文件内的其他函数暴露一个接口去访问.
//我是一号文件
int a = 10;
int* p = &a;
static void change()
{
a++;
printf("%d", a);
}
void jiekou()
{
change();
}
//我是2号文件
#includeextern int a;
extern int* p;
int main()
{
(*p)++;
printf("%d\n", *p);
jiekou();
return 0;
}
打印出来依然是11和12。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享题目:C语言-static关键字-创新互联
标题来源:http://scyanting.com/article/dhjdoi.html