关键字static修饰变量和函数
在C语言中,static关键字可以用来修饰变量和函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。
修饰局部变量—静态局部变量
修饰全局变量—静态全局变量
修饰函数—静态函数
作用域:程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效的/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域:变量所在的局部范围。
2.全局变量的作用域:整个工程。
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2.全局变量的生命周期是:整个程序的生命周期。
static修饰局部变量
代码1:
#include <stdio.h>
void add()
{
int num = 0;
num ++;
printf("%d\n",num);
}
int main()
{
int i;
for(i = 0; i < 5; i ++)
{
add();
}
return 0;
}
输出:
1
1
1
1
1
请按任意键继续. . .
代码1中num为在add()函数内部定义的局部变量,作用域为add()函数内部,生命周期一次为add()函数运行期间。main()函数每调用一次add()函数,num = 0;调用结束局部变量num的生命周期也就结束了。 下次调用add()函数时,局部变量num又从赋值为0开始。所以每次打印出来的值都是一样的。
代码2:
#include <stdio.h>
void add()
{
//static修饰局部变量
static int num = 0;//局部变量定义时前面加上static关键字
num ++;
printf("%d\n",num);
}
int main()
{
int i;
for(i = 0; i < 5; i ++)
{
add();
}
return 0;
}
输出:
1
2
3
4
5
请按任意键继续. . .
代码2中在add()函数内部的局部变量num用static关键字修饰。static修饰的局部变量num变成了静态局部变量。static修饰局部变量改变了变量的生命周期,(局部变量的作用域没变),让静态局部变量出了作用域依然存在,到程序结束生命周期才结束。生命周期变为整个程序运行期间。所以每一次调用add()函数都是在之前的变量num的基础上操作。所以;输出的结果是num累加1。
结论:
static修饰局部变量改变了变量的生命周期,(局部变量的作用域没变),让静态局部变量出了作用域依然存在,到程序结束生命周期才结束。生命周期变为整个程序运行期间。
修饰全局变量
在add.c 和test.c两个源文件中
代码1:
//add.c中
int val = 2020;
//test.c中
#include <stdio.h>
extern int val;//没有extern声明全局变量val编译失败。 error C2065: “val”: 未声明的标识符
int main()
{
printf("%d\n",val);
return 0;
}
输出:
2020
请按任意键继续. . .
说明全局变量用extern声明之后可以在整个工程里使用。
代码2:
//add.c中
static nt val = 2020;
//test.c中
#include <stdio.h>
extern int val;//用extern声明也不可以
int main()
{
printf("%d\n",val);
return 0;
}
全局变量val被static修饰后,编译失败,发生错误error LNK2001: 无法解析的外部符号 _val
。程序编译时出现了连接性错误。全局变量val被static修饰后,作用域改变了。
结论:
一个全局变量被关键字static修饰,改变了变量可见性,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
修饰函数
和全局变量一样,函数可以在整个工程内使用。
在add.c 和test.c两个源文件中
代码1:
//在add.c中
int Add(int a, int b)
{
return a+b;
}
//在test.c中
#include <stdio.h>
extern int Add (int a, int b);//extern声明外部函数
int main ()
{
printf("%d\n",Add(2, 3));
return 0;
}
输出:
5
请按任意键继续. . .
说明函数用extern声明之后可以在整个工程里使用。
代码2:
//在add.c中
static int Add(int a, int b)
{
return a+b;
}
//在test.c中
#include <stdio.h>
extern int Add (int a, int b);//extern声明外部函数
int main ()
{
printf("%d\n",Add(2, 3));
return 0;
}
Add函数被关键字static后和全局变量一样会发生修饰编译错误,error LNK2001: 无法解析的外部符号 _Add
。程序编译时出现了连接性错误。函数被static修饰后,函数的作用域改变了。
结论:
一个函数被关键字static修饰,改变了函数可见性,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。