c语言static关键字的理解
static
一、概述
在c语言中static恰当的使用能让程序更加完美,细节上的严谨,代码会更好,也更利于程序的维护与扩展。
而static使用灵活,且又有两种完全无关的用法,所以整理总结一下。
二、static的两种用法:
1、static修饰局部变量,成为一个局部静态变量。
2、static修饰全局变量与函数,成为静态全局变量与静态函数。
三、相关涉及概念
可能会疑惑,修饰全局变量与修饰函数怎么会是一个用法?
static涉及的东西也比较多,以下有几个概念需要明白。
1、什么是存储类
简单的说也就是存储类型,c中变量是在哪里存放的?内存是怎么管理的?
所以内存的管理:
①栈:局部变量,函数调用传参的过程
②堆:动态存储区,需要程序员去申请释放
③数据段(data段):显式初始化非零的全局变量(static修饰显式初始化非0的局部变量)
④bss段:显式初始化为0与未初始化的全局变量(static修饰显式初始化为0与未初始化的局部变量)
⑤text段:代码(函数)、只读数据
2、什么是生命周期
描述变量什么时候诞生,什么时候消亡,从诞生到消亡就是这个变量的生命周期。
①局部变量(栈),生命周期即是进入函数,从变量创建到函数返回时变量死亡。
②全局变量(data/bss),生命周期是程序执行到程序结束
③堆变量,生命周期是从我们malloc到free
3、什么是作用域
描述变量的作用的代码范围。c的作用域规则是代码块作用域,即是一对花括号{}。
一般的从变量定义到{}结束,即是这个变量的作用域
全局变量与函数一般是文件作用域,即作用域是整个.c
4、什么是链接属性
编译器将很多源文件编译成很多.o文件后,每个.o文件里有符号、代码段、data/bss等等的分段,链接器需要通过符号将这些内存链接起来。而这些符号就是链接属性。
c中有三种链接属性:外链接、内链接、无链接属性。
外链接:外部链接,可以在整个程序(跨文件)链接。
普通的函数与全局变量。
内链接:内部连接,只能在当前.c文件进行链接。
static修饰的全局变量与函数
无链接:没有链接。
普通局部变量
四、具体分析static的两种用法
1、static修饰局部变量(静态局部变量)与普通局部变量相比
①静态局部变量作用域与连接属性与普通局部变量一样
②存储类:静态局部变量分配在data/bss段,普通局部变量在栈上。
③生命周期:因为存储类的不同,静态局部变量的生命周期得到延长了,直到程序结束。
所以当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。
2、static修饰全局变量\函数 与 普通全局变量\普通函数相比
存储类、生命周期、作用域都一样
差别在于static修饰全局变量\函数连接属性是内连接,普通全局变量\普通函数是外链接
就是说static修饰全局变量\函数不能跨文件访问调用
五、补充:为什么需要这样?
原因是命名的冲突、一个大工程不是常常不是一个人完成的,难免会遇到全局变量、函数命名一样。为了减少这类冲突static是很有用的工具。但是很可惜并不能完全解决,所以我们应该有效的去避免减少此类情况的发生。
如果函数仅仅被同一个源文件调用时,我们就应该声明该函数为static。
......
作者:Devil-wei
出处:https://www.cnblogs.com/Devil-wei/
版权声明:本文版权归作者,转载请标注文章作者与出处
c语言static关键字的理解的更多相关文章
- C语言static关键字
C语言static关键字 static关键字的作用,主要从在程序的生存周期.作用域和在代码段中的位置起作用. 全局变量 静态全局变量 局部变量 静态局部量 生存周期 程序运行到结束 程序运行到结束 函 ...
- C语言学习及应用笔记之二:C语言static关键字及其使用
C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些.我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂. 一般来说static关键字的常见用 ...
- java中static关键字的理解(转载)
static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...
- php中static关键字的理解
函数内的static变量 static静态变量的理解 静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整 ...
- ios开发static关键字的理解
:static关键字修饰局部变量::当static关键字修饰局部变量时,该局部变量只会初始化一次,在系统中只有一份内存 :static关键字不可以改变局部变量的作用域,但是可延长局部变量的生命周期,该 ...
- Static关键字深入理解
1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量. 两者的区别是: 对于静态变量在 ...
- static关键字的理解
#include<stdio.h> int counter(int i){ static int count=0;//编译时只运行一次 count=count+i; return coun ...
- c语言typedef关键字的理解
1.typedef的定义 很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关.本来嘛,type 是数据类型的意思:def(ine)是定义的意思,合起来就是定义数据类型啦. 不过很遗憾 ...
- 【Java基础】static关键字的理解
修饰范围: 可以修饰成员变量和成员方法.静态的特点: A:随着类的加载而加载 B:优先于对象存在 C:被类的所有对象共享 这其实也是我们判断该不该使用静态的依据. 举例:饮水机和水杯的问题思考可通过类 ...
随机推荐
- keil4编译Error: User Command terminated, Exit-Code = 1解决
编译出错结果如下图: 通过分析可看出,错误原因是:调用fromelf.exe指令的路径不对.Keil中设置的是 E:\Keil\ARM\BIN40\fromelf.exe(安装Keil位置不同,此处显 ...
- Tomcat更新方法
tomcat更新方法最简单的就是上官网下载最新版的压缩包,然后用新版本的 lib 文件替换掉旧版本的 lib 文件 具体方法(偷懒做个搬运工):https://jingyan.baidu.com/ar ...
- CAP 2.4版本发布,支持版本隔离特性
前言 自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一 ...
- 开源:ASP.NET Aries 开发框架(已支持.NET Core)
前言: 随着岁月的推进,不知不觉已在.NET这领域上战斗了十年了. 青春还没来得急好好感受,却已是步入健忘之秋的老人一枚了. 趁着还有点记忆,得赶紧把硬盘里那私藏的80G除外的东西,和大伙分享分享. ...
- webgl自学笔记——深度监测与混合
这一章中关于webgl中颜色的使用我们将深入研究.我们将从研究颜色在webgl和essl中如何被组装和获取开始.然后我们讨论在物体.光照和场景中颜色的使用.这之后我们将看到当一个物体在另一个物体前面是 ...
- Scala设计模式
尽管Scala还有一些基于语言特性的设计模式,单本文还是着重于介绍大家所周知的经典设计模式,因为这些设计模式被认为是开发者之间交流的工具. 创建型设计模式 1.工厂方法模式 2.延迟加载模式 3.单例 ...
- jquery mobile 建wap站
使用jquery mobile 建手机wap站: 几篇比较好的文章 http://wap.yesky.com/dev/225/30974725.shtml http://tech.it168.com/ ...
- Notepad++ 安装连接服务器的NppFTP插件
用Notepad++连接服务器,可以随时编辑一些文件不用特意下载.有时重做系统经常忘记一些插件备份到了哪.再此做个记录,方便重新安装. 下载完NppFTP插件,解压后将bin文件夹下的NppFTP.d ...
- 【Android Studio安装部署系列】二十二、Android studio自动生成set、get方法
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 操作步骤 将光标放置我们所要生成get,set方法的实体类空白处——然后右键——选择Generate. 选择“Getter and Set ...
- 详解TypScript数据类型转换
最近在用TypeScript(后面简称TS),发现TS虽然语法和C#差不多但是在很多地方还是不够高级(和C#相比),这里主要聚焦在数据类型强转上面,直接看下面案例吧 string转number 案例如 ...