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修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。