1.什么是static?
1.1. static的引入
在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? static 关键字则可以很好的解决这个问题。
静态变量即被static修饰的变量,并不是说不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
1.2. 局部变量
局部变量从存储方式上可分为动态存储类型和静态存储类型。函数中的局部变量,如不专门声明为 static 存储类别,默认都是动态地分配存储空间。其中的内部动态变量在函数调用结束后自动释放。
2.静态全局和静态局部变量
2.1. 静态局部变量
static类型的内部变量是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量。它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。
函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作。
静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。
总结特点:
- 在全局数据区分配内存;
- 在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;如果没有显式初始化,会被程序自动初始化为 0;
- 始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
2.2. 静态全局变量
全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。
总结特点:
- 静态变量都在全局数据区分配内存;
- 未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为 0);
- 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
优点:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。
2.3.全局变量和静态全局变量的区别
1)全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。
2)全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。
总结出————
- 把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
- 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
-
static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
本文介绍了static关键字在C/C++中的应用,包括static变量的引入、存储方式(局部动态与静态)、静态局部变量和静态全局变量的特点,以及它们与全局变量的区别,强调了static变量对生存期和作用域的影响。
837

被折叠的 条评论
为什么被折叠?



