在C语言中,static是用来修饰变量和函数的,字面含义是“静态”实际上,功能和“静态”两字没有关系!
变量的作用域(scope):变量在哪些代码中能用(变量的可用范围)。
变量的生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
修饰局部变量-静态局部变量:
改变了这个变量的生命周期,生命周期跟随整个程序,不改变作用域
void print()
{
int num = 1;
printf("num = %d\n", num);
num++;
}
int main()
{ print();
print();
print();
return 0;
}
运行结果:
num =1
num =1
num =1
加static修饰
void print()
{
static int num = 1; //修饰一个局部变量
printf("num = %d\n", num);
num++;
}
int main()
{ print();
print();
print();
//printf("num = %d\n", num); //编译出错(num未声明的标识符)
return 0;
}
运行结果:
num =1
num =2
num =3
修饰全局变量-静态全局变量
改变了变量的作用域,使其只能在当前文件中使用,不影响其生命周期
//text.c
//c中的函数或变量使用之前要现有声明/定义
//其中extern可以省略
//声明语句不能进行初始化这样的操作
extern int global;
int main()
{
printf("global = %d\n", global);
return 0;
}
运行结果:
global = 10
加static修饰
extern int global;
int main()
{
printf("global = %d\n", global);//无法运行
return 0;
}
链接错误:只看见了变量/函数的声明,没有在其他文件中找到对应的定义
修饰函数-静态函数
和修饰全局变量相同,改变了函数的作用域,使其只能在当前文件中使用,不影响其生命周期
//extern int add(int, int); //函数声明时,形参名可以不写
extern int add(int x, int y);
int main(){
printf("%d\n",add(10,20));
return 0;
}
结果:
30
加static修饰
extern int add(int x, int y);
int main(){
printf("%d\n",add(10,20));
return 0;
}