static 修饰的变量与普通变量

本文介绍了static关键字在C/C++中的应用,包括static变量的引入、存储方式(局部动态与静态)、静态局部变量和静态全局变量的特点,以及它们与全局变量的区别,强调了static变量对生存期和作用域的影响。

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静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量堆变量的区别。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值