博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言关键字-static
阅读量:6069 次
发布时间:2019-06-20

本文共 1885 字,大约阅读时间需要 6 分钟。

一、static关键字三个作用

定义全局静态变量,定义局部静态变量,定义静态函数



二、c语言中static作用

  1. 在修身变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期直至程序运行结束才释放。一个被声明为静态的变量在这一函数被调用的过程中维持其值不变
  2. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数调用,他是一个本地的全局变量。。另一种说法即:static修饰的全局变量,这个全局变量只能在本文件中被访问,不能在其他文件中访问,即便是使用extern外部声明也不可以
  3. static修饰一个函数,则这个函数只能在本文件中调用,不能被其他文件调用,static修饰的局部变量存放在全局静态存储区。

(1):不想被释放的时候可以用static修饰。比如修饰函数中存放在栈空间的数组,如果不想让这个数组在函数调用结束释放则可以使用static修饰。

 

 

(2):考虑到数据本地化与代码范围的好处时可以使用static。当想要使用全局变量的时候应该优先考虑使用static.

 

 



 

三、static修饰全局变量与普通全局变量区别,static修饰局部变量与普通局部变量区别,static修饰函数与普通函数区别、

  1. 全局变量加上static就成了静态的全局变量。全局变量本身就是静态存储方式,所以两者在存储方式上没有区别。static全局变量只初始化一次。两者的区别在于,非静态全局变量的作用域是整个源文件,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域即只在定义该文件的原文件中有效,在同一程序的其他源文件下则不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他的源文件中引起错误。

把全局变量改变为静态的全局变量后存储方式没变但改变了它的作用域,限制了他的使用范围。

 

2.局部变量加static后就变成了静态的局部变量,static局部变量只被初始化一次,在两次函数调用时,第二次调用进入时仍保持第一次调用时退出的值。下一次仍然是上次的结果值,即被声明为静态的局部变量在这一函数被调用的过程中维持其值不变。在函数调用结束后变量不会被销毁,直到程序运行结束static变量才会被回收。所以把局部变量改变为静态的局部变量后改变了它的存储方式,即改变了它的生存期。

把局部变量改为静态的局部变量后存储方式改变了,生存期延长了。普通的局部变量的存储空间都分配在栈区,每次被函数调用时分配的空间可能都不一样,而static局部变量具有全局唯一的特点,每次被调用时都指向同一内存,因此值在函数中不变,变量一直到程序结束才被回收

 

1.初始化与赋值的区别:

    初始化:变量定义的同时给其一个值。

    赋值:变量已经存在再给其一个值。

   3.函数加上static后,static函数的作用域仅限在本文件,不能被其他文件调用。这个函数被限制在声明它的模块的本地范围内使用。而且static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。



 

 四、static函数实例

  •   不加static修饰
1 #include 
2 void test() 3 { 4 int num=0; 5 num++; 6 print("%d",num); 7 } 8 int main() 9 {10 int i=0;11 for(i=0;i<10;i++)12 {13 test();14 }15 return 0;16 } 运行结果为:1111111111

 

  •  变量被static修饰
#include
void test(){static int num=0;num++;printf("%d",num);}int main(){int i=0;for(i=0;i<10;i++){test();}}运行结果为:12345678910

 

 

  • 不加static修饰,函数或代码块中的变量在函数或代码块执行完毕后就直接回收销毁了,每次执行都会重新分配内存,每次都会销毁。
  • 加static修饰,函数或代码快中的变量在函数或代码块执行第一次初始化并分配内存后,就算函数或代码块执行完毕,该变量也不会被回收销毁,直到程序运行结束static变量才会被回收

 

 

    

 

转载于:https://www.cnblogs.com/southcyy/p/10165760.html

你可能感兴趣的文章
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
dom4j解析xml文件
查看>>
第六周
查看>>
斯坦福大学公开课机器学习:梯度下降运算的学习率a(gradient descent in practice 2:learning rate alpha)...
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>