c语言基础(二)——关键字static的三种用法

static的三种用法

  • 一.static修饰局部变量
  • 二.static修饰全局变量
  • 三.static修饰函数
  • 总结

引言
static这个关键字是静态的意思,在c语言中,常用来修饰局部变量,全局变量和函数。被修饰后的变量或函数,他们的作用域或生命周期会改变。

一.static修饰局部变量

先看看这样一段代码,结果是什么?

#include 
void test()
{
    int a = 1;
	a++;
	printf("%d ", a);
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}	

结果如下
在这里插入图片描述

如果我用static修饰变量a呢?

#include 
void test()
{
    static int a = 1;
	a++;
	printf("%d ", a);
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}	

结果如下
在这里插入图片描述

原因是什么呢?
第一段代码中,a是一个普通的局部变量,我们知道,局部变量进入作用域生命周期开始,出作用域生命周期结束。while循环要进行10次,每次循环都要创建a,初始化为1,然后自加1,打印结果2,最后销毁,如此循环往复进行10次。

第二段代码中,局部变量a被static修饰,使得它的生命周期被改变,出了作用域不会被销毁,不会反复地创建和初始化a。

这里拓展一个知识:计算机地内存分为三个区域——栈区、堆区和静态区
c语言基础(二)——关键字static的三种用法_第1张图片

  • 一个普通的局部变量是放在栈区的,出了作用域就会被销毁
  • 而被static的修饰的局部变量,是放在内存的静态区的,存储位置发生了变化,使得局部变量出了作用域不会销毁,影响了变量的生命周期

小结
static修饰的局部变量生命周期会改变,作用域不受影响

二.static修饰全局变量

c语言基础(二)——关键字static的三种用法_第2张图片
如图,全局变量在整个工程中都可以使用。

但用static修饰全局变量就不一样了
c语言基础(二)——关键字static的三种用法_第3张图片
编译器报错无法解析外部符号g_val

原因是什么呢?

  • 一个全局变量在整个工程中都可以使用的。全局变量是具有外部链接属性的,在其他源文件内部,只要适当地声明就可以使用
  • static修饰全局变量,这时全局变量的外部链接属性就变成了内部链接属性,只能在自己所在的.c文件内部使用,其他.c文件无法使用

小结
static修饰的全局变量作用域会改变,生命周期不受影响

三.static修饰函数

c语言基础(二)——关键字static的三种用法_第4张图片
Add函数和全局变量类似,也具有外部链接属性,整个工程都能使用。从图中可以看出我并没有用extern声明Add这个外部符号,但编译器也没有报错。但有些编译器会报警告(例如VS2019,我用的是VS2022),所以保险起见,可以在test.c文件中加上 extern int Add(int,int)这样一个声明。

加上static呢?
c语言基础(二)——关键字static的三种用法_第5张图片
编译器报错无法解析外部符号Add
所以static修饰函数与修饰全局变量是类似的。

  • 函数是具有外部链接属性的,整个工程都可以使用
  • static 修饰函数后,函数的外部链接属性就变成了内部链接属性,被static修饰的函数只能在自己所在的.c文件内使用,其他.c文件无法使用

小结
static修饰函数相当于影响函数的作用域

总结

  • static修饰局部变量,使变量的存储位置从栈区变为静态区,生命周期被影响
  • static修饰全局变量,使变量的外部链接属性变为内部链接属性,作用域被影响
  • static修饰函数,使函数的外部链接属性变为内部链接属性,作用域被影响

你可能感兴趣的:(c语言,算法,java)