【C语言】static的用法

目录

static修饰局部变量

static修饰全局变量

static修饰函数

总结


static修饰局部变量

static修饰的局部变量也可以称为静态局部变量

为了引入static,我们先分析一下下面代码的运行结果:

#include<stdio.h>
void test()
{
    int a = 5;
	a++;
	printf("%d ", a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

代码中有一个test函数,test函数中定义了一个局部变量a;每次调用test函数,都会在内存中给a分配一块空间,a的初始值是5,然后a自加1。test函数调用结束时,a这个变量就会被销毁,下一次调用test函数时再重新给a分配内存空间。而test函数一共调用了10次,因此屏幕上出现10个6

如果再a的前面加上关键字static,结果会怎么样呢?答案还是10个6吗?

#include<stdio.h>
void test()
{
    static int a = 5;
	a++;
	printf("%d ", a);
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

 我们发现此次出现的结果和上面并不一样:a似乎出现了一种累加的效果

 下面分析原理:

C/C++代码学习的时候,把内存大概划分为3个区域:栈区,静态区,堆区

 而被static修饰的变量就是静态变量,由上图我们已经知道,静态 区创建好的变量会直到程序结束才销毁,所以每次当test函数结束时,变量a并没有被销毁,每次调用test函数时,a的值都是前一次调用结束时的值。

由此可知:static修饰局部变量的时候,本来一个局部变量是存在栈区的,被static修饰就存在静态区了,static修饰局部变量改变了变量的存储类型(位置)最终使得这个静态变量的生命周期变长了,但作用域不变。

 static修饰的局部变量和全局变量的区别:static修饰的局部变量只能再局部的作用域内使用。

static修饰全局变量

static修饰的全局变量也可以称为静态全局变量

当我们在一个工程下创建多个文件,如下图

 此时程序可以正常运行:

 但是,当我们把全局变量g_val用static修饰后,程序就会出现报错:

  之所以出现报错,就是因为加了static的原因。

static修饰全局变量,改变了这个全局变量的链接属性,由外部链接属性变成了内部链接属性,这个静态变量只能在自己所在源文件内部使用,不能再其他源文件内部使用了。(感觉像是作用域变小)

static修饰函数

static修饰的函数也称为静态函数

下面是一个工程中创建了两个文件,add.c文件和test2.c文件

 此时编译起来程序正常运行

但是,当我们将Add用static修饰时,程序出现了报错,报错信息和static修饰全局变量那块一样:

static修饰函数和static修饰全局变量是一样的

函数本身具有外部连接属性,但是被static修饰就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能再其他文件内部使用。

总结

static修饰局部变量

        static修饰局部变量改变了变量的生命周期 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

static修饰全局变量

        一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。

static修饰函数

        一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。


 

猜你喜欢

转载自blog.csdn.net/m0_73648729/article/details/130161171
今日推荐