【C】static关键字详解

概述

static的汉语意思是静态的,在C语言中static关键字可以用来修饰局部变量、全局变量和函数。
在这里给大家补充一个知识,我们的数据在内存中存储时,大概分为3个区域。
1.栈区:我们创建的局部变量、形参等一般就存放在这个区域,离开作用域是会自动销毁,将空间还给操作系统。
2.堆区:堆区存储的数据一般是由我们程序员自己来开辟的,比如使用malloc、realloc等来动态开辟,这个区域的空间需要我们程序员自己释放,否则就会造成内存泄漏。
3.静态区:这里一般存储的是全局变量和静态变量,他是有操作系统创建的,工程结束后由操作系统回收。

static修饰局部变量

在讲这个之前我们先来比较两段代码:

#include
void test()
{
	int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

运行结果为:
【C】static关键字详解_第1张图片

再来看下面这段代码:

#include
void test()
{
	static int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

运行结果为:
【C】static关键字详解_第2张图片
我们可以看到,这两段代码一个test函数中的i用了static关键字修饰,一个没有,造成运行结果有这么大的差异,这是为什么呢?
其实道理很简单,static来修饰局部变量,该变量就变成了静态变量,那么它就从原本的栈区改变到了静态区,它不会随着函数的结束而被销毁,因此我们就看到了下面的这个结果,我们在这里可以理解为static修饰局部变量延长了局部变量的生命周期。
在这里需要注意的是,static修饰的局部变量,在编译时已经创建了,并不是程序走到这个位置才创建的。

static修饰全局变量

全局变量具有外部链接属性,就是我们在一个工程中可以有多个.c文件,在别的文件中定义的全局变量是可以在我们本文件中使用的,我们在使用的时候只需要用exturn声明一下就可以使用。如:
【C】static关键字详解_第3张图片
我们是可以使用另一个.c文件中的全局变量的,但是如果static修饰了这个全局变量,就使它的外部链接属性变成了内部链接属性,这时我们只能在定义那个全局变量的文件中使用,在别的文件中就不能使用。

static修饰函数

static修饰函数和修饰全局变量非常相似,C语言中函数也是具有外部链接属性的,用static修饰后,也是使它的外部链接属性变成了内部链接属性,这是也只能在定义这个函数的.c文件中使用,在别的文件中无法使用。

今天的分享就到这里了,感谢大家的关注和支持!

你可能感兴趣的:(c语言,开发语言,学习)