在C语言中,static通常有2种含义:1)定义变量的生命周期;2)定义变量或者函数的作用域。

变量的生命周期是指,相对于程序运行的进程生命周期,变量存在的时间段。变量的生命周期由变量的存储类型(位置)决定。因此static的第1种含义也可以理解为,static定义了变量的存储类型(位置)。

C语言中,变量存储位置分为栈、全局静态区、堆。栈用来做函数调用,参数传递等,在程序的运行过程中是操作最频繁的数据区。全局静态区,是变量一直存在于内存中,在程序整个运行过程中不会被销毁。堆,是由操作系统维护的大空间内存伸缩区,进程可以主动向操作系统申请使用堆的存储,在程序运行过程中动态申请。

由static修饰的变量,其存储类型为全局静态区,变量在程序的整个运行过程中不会被销毁,并且只会被初始化1次。

代码1:static修饰变量的生命周期(存储类型)

  1. void func1()
  2. {
  3. static int var1 = ; // 在全局静态区分配变量var1的存储空间
  4. int var2 = ; // 在栈上分配var2的存储空间
  5.  
  6. var1 = var1+;
  7. var2 = var2+;
  8.  
  9. printf("var1=%d, var2=%d", var1, var2)
  10. }
  11.  
  12. void main()
  13. {
  14. func1();
  15. func1();
  16. func1();
  17. }

代码输出:

“var1=2, var2=2”

“var1=3, var2=2”

“var1=4, var2=2”

作用域是指变量/函数的可见区域,可被引用区域。在C语言中,不加static修饰的函数对所有的源文件都是可见的,不加static修饰的全局变量对所有的源文件都是可见的。通过static修饰,可以把函数的作用域限定在本源文件内,把全局变量的作用域限定在本源文件内。

由于全局变量和函数的作用域是所有源文件,所有源文件引用的是同一个全局变量和函数,因此C语言不允许在2个源文件内定义相同的全局变量、函数,在代码链接阶段会提示链接错误。通过添加static修饰,可以让2个源文件定义相同的全局变量和函数,但是注意这2个源文件引用的全局变量和函数是独立的。

static常见使用场合

  1. static int var1 = ; // 限定全局变量var1仅在本源文件可见
  2. static void func1() // 限定函数仅在本源文件可见
  3. {
  4. static int var2 =; // var2是静态变量,不是栈变量,只被初始化一次
  5. }
  6.  
  7. void main()
  8. {
  9. func1();
  10. }

C语言中static修饰符的意义的更多相关文章

  1. 在不同语言中static的用法

    static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...

  2. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  3. C语言中static的使用方法【转】

    本文转自:http://blog.csdn.net/renren900207/article/details/21609649 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量 ...

  4. c语言中static 函数和普通函数的区别

    C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放 ...

  5. static修饰符

    static修饰符表示静态的,可修饰字段.方法.内部类,其修饰的成员属于类,也就是说static修饰的资源属于类级别,而不是对象级别. static的正真作用:用来区别字段,方法,内部类,初始化代码块 ...

  6. java final .static修饰符

    static静态修饰符(使用static修饰符修饰的成员变量.常量.和成员方法成为静态变量.常量和方法,他们统称为静态成员,归整个类所有,不依赖于类的特定实例,被类的所有实例共享,只要这个类被加载,J ...

  7. 201671010127 2016-2017-8 回谈static修饰符

    上周学了泛型程序程序设计技术,再一次接触到了静态方法,那么今天就来谈一下static修饰符. static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块, ...

  8. C# Static修饰符的作用

    MSDN上的定义 Use the static modifier to declare a static member, which belongs to the type itself rather ...

  9. 4. static修饰符

    一.static修饰符概述 1. static修饰的成员表明它属于这个类本身,而不属于该类的单个实例 把static修饰的成员变量和方法称为类变量.类方法 2. 不使用static修饰的成员则属于该类 ...

随机推荐

  1. 坑爹的AMH

    坑爹的 AMH的配置文件在这里: nginx 配置文件1:/usr/local/nginx-generic-1.6/conf/nginx.conf nginx 配置文件2:/home/wwwroot/ ...

  2. [转]nginx虚拟目录(alias与root的区别)

    今天配置awstats,awstats创建出的文件目录在/home/awstats下,在nginx中加入配置后狂报404,发现还是忽略了root和alias的区别,特将修改配置记录如下: 1.失败:s ...

  3. MFC消息循环

    MFC消息循环 MFC应用程序中处理消息的顺序 1.AfxWndProc()  该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc. 2.AfxCallWndProc ...

  4. Linux上面缺少rz和sz命令

    一.centos系统没有自带rz/sz命令 yum install lrzsz 搞定! 二.对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / ...

  5. 029:高可用之MHA

    高可用之MHA 一.MHA 简介 MHA(Master High Availability)是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能 ...

  6. Servlet3.0的简单使用

    Servlet3.0(WEB3.0)算是比较新的Servlet技术了,对应的JavaEE版本是6,虽然目前最新的版本是3.1,对应版本JavaEE7.我们目前使用的做多的还是Servlet2.5的东西 ...

  7. CentOS7 安装Chrome

    1. 下载Chrome浏览器的rpm包 https://www.chrome64bit.com/index.php/google-chrome-64-bit-for-linux 2. 安装Chrome ...

  8. cnzz 模拟请求登录(传入url get data ) demo

    /** * * @Title: init * @Description: TODO 初始化httpclien * @param url * cnzz对应的链接 * @param password * ...

  9. Timestamp类型浅析

    Oracle针对不同的数据需求,提供了多种类.多层次的数据类型体系.我们在实际应用中,最好可以依据业务数据的实际形态和前端应用的语言.框架特性来确定字段类型的选择. Date类型是我们经常使用的时间类 ...

  10. apache 自定义404错误页面

    1.有些提供web服务的网站,在用户访问一个不存在的网站文件时,会提示404错误,如下所示: 现在要求自定义一个错误页面,也就是出现404错误代码时,跳转到我们自定义的网址上.下面记录下方法: 1.编 ...