static- 静态 关键字
用三种法:可以修饰局部变量,全局变量,还可以修饰函数
void test()//test()函数执行完后要返回一点东西 ,此处的test函数不需要任何返回,则此时返回类型写void(不需要任何返回)
{
int a = 1;//每次进入test函数变量a就会被重新定义 值为1
a++;
printf("%d\n",a);
}
int main()
{
int i = 0;
while(i<10)//循环10次
{
test();//test函数
i++;
}
return 0;
}
输出结果:2 2 2 2 2 2 2 2 2 2 (10个2)
原因:
每次进入test()函数中,就会创建局部变量a
每次循环a都会被重新定义一次
1. 修饰局部变量
当在局部变量a前面加上static修饰
结果如下:2 3 4 5 6 7 8 9 10 11
static 修饰局部变量的时候,局部变量出了作用域,不销毁
本质上static修饰局部变量的时候,改变了变量的存储位置
变量的存储位置:根据不同的类型分在内存不同的区域中
a原来为局部变量,在栈区中被存储
被static修饰后存储位置由栈区变成静态区
变量类型由局部变量,变成了静态变量
实际上:影响了变量的生命周期,生命周期变长,和程序的生命周期一样长
2. 修饰全局变量
什么是全局变量?
答:写在函数外的变量(在大括号外的变量)
int q_a = 2022 // q_a就是全局变量
int main()
{
...
return 0;
}
全局变量具有外部链接属性(编译+链接–> 可执行程序)
eg:全局变量可以被定义在另一个文件中
extern:用extern修饰变量是修饰外部变量
当我们在全局变量前面加上static修饰时
文件无法运行,报错
当全局变量被static修饰后,全局变量的外部链接属性变成了内部链接属性,其他的源文件(.c)就不能在使用到这个全局变量了
3. 修饰函数
先举一个简单的求和函数的例子(计算两数和)
#include <stdio.h>
int Add(int x, int y)
{
return (x + y);
}
int main()
{
int a = 10;
int b = 20;
int z = Add(a, b);
printf("%d\n", z);
return 0;
}
在看另一种方式;
如果我们需要的函数,这个函数定义在其他源文件的,当我们想使用他的时候,我们要进行合理科学的声明(extern int Add(int x,int y);)
我们就能正常的使用它
为什么能这么写呢
答:函数和全局变量相似,也具有外部链接属性
当函数被static修饰函数后
出现报错 ,文件无法成功链接
原因:一个函数本来具有外部链接属性,但是被static修饰的时候,外部链接属性就变成了内部链接属性,其他源文件(.c)就无法使用