C语言中,static关键字的作用与实例
在c语言的学习和应用中,会遇到很多常见的关键字,比如auto 、break 、case 、char 、 const 、 continue、 default、 do 、 double 、else 、 enum、 static、 extern等等。 而且它们在实现不同功能 需求的代码中发挥着自己的独特作用。本文针对static关键字的作用以代码实例的形式进行总结归纳,仅供参考。
在C语言中,static关键字的作用为修饰变量和函数,包括:
1.修饰局部变量
2.修饰全局变量
3.修饰函数
1.修饰局部变量
当static修饰局部变量时,可以达到改变局部变量生命周期的目的,例如:
void test()
{
static int a=1; //statis改变局部变量的生命周期;变量没有被销毁时,不需要被再次定义;
a++;
printf("%d\n",a);
}//函数调用完之后会被销毁,所以每次打印的都是2;
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
运行结果为:
2 2 2 2 2 2 2 2 2 2 (10个2)
原因在于static int a=1创建了一个静态的局部变量,使得局部变量a的生命周期变长,上一次的a值仍被保留在作用域内未被销毁,每次循环调用函数test()时,上一次的a值仍被保留在作用域内,不再执行static int a=1代码语句,即不需要对变量a重新初始化。
2.修饰全局变量
当static修饰全局部变量时,可以达到改变全局变量作用域目的,使得全局变量只能在其被定义的源文件之下被找到,即本质上是改变了链接属性。例如:
在test.c文件中有如下代码段:
extern int g_val; //声明外部变量
int main()
{
printf("%d\n",g_val);
return 0;
}
在add.c文件中定义一个全局变量:
//定义一个全局变量
static int g_val = 2020;
调试运行:
1>------ 已启动生成: 项目: test_lxl_3_15, 配置: Debug Win32 ------
1> test.c
1>test.obj : error LNK2001: 无法解析的外部符号 _g_val
1>H:\2020C C++学习\ClassCode\test_lxl_3_15\Debug\test_lxl_3_15.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
代码出现报错:error LNK1120: 1 个无法解析的外部命令,就是由于static修饰的全局变量被改变了作用域,使得全局变量g_val只能在其源文件内部被找到。而去掉static之后,程序将会正常运行。
3.修饰函数
当关键字static修饰函数时,与2中相似,也是改变了函数的作用域,本质上改变了链接属性。
例如:
在test.c文件中有:
extern int Add(int x, int y);
int main()
{
int a = 8;
int b = 9;
int sum = Add(a,b);
printf("sum=%d\n",sum);
return 0;
}
在add.c文件中定义一个静态修饰的函数:
//定义了一个静态修饰的函数
static int Add(int x,int y)
{
int z = x + y;
return z;
}
调试运行:
1>------ 已启动生成: 项目: test_lxl_3_15, 配置: Debug Win32 ------
1> test.c
1>test.obj : error LNK2019: 无法解析的外部符号 _Add,该符号在函数 _main 中被引用
1>H:\2020C C++学习\ClassCode\test_lxl_3_15\Debug\test_lxl_3_15.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
出现链接出错,也是由于static改变了修饰对象的作用域,使作用域变小,Add()函数只能在add.c中被找到。
了解了C语言中关键字static的作用,可以让我们在C语言以后的学习和应用中注意到这些细节的东西,减少出错。