C语言中,static关键字的作用与实例

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语言以后的学习和应用中注意到这些细节的东西,减少出错。

发布了3 篇原创文章 · 获赞 2 · 访问量 362

猜你喜欢

转载自blog.csdn.net/lxl700204/article/details/104878488