前言:在C语言中,static的字面意思容易给我们带来些许误解,在开发过程中,我们经常会需要定义一些static类型的变量和函数,所以我们具体聊聊static。

static在C语言中的三大作用:
一、隐藏功能,对于static修饰的函数和全局变量而言;
二、保持持久性功能,对于static修饰的局部变量而言;
三、由于存放在静态区,全局和局部的static修饰的变量,默认初始化都为0。

一般来说static关键字的常见用法有三种:一是用作局部变量的修饰符;二是用作全局变量的修饰符;三是用作函数的修饰符。本文接下来详细分析这三种用法。

1、修饰局部变量
当用static来修饰一个变量时,就注定了该变量的可见范围和生命周期。当static用于修饰局部变量时,通常是在函数体内,而且只能在该函数内被调用。但是这样定义的变量通常被称为局部静态变量,它的值不会因为函数调用的结束而被清除,相反当函数再次被调用时,它的值将会是上一次被调用结束后的值。
比如,定义如下的两个变量var1和var2:
void function(void)
{
int var1;
static int var2;
}
在上面这个例子中,变量var1是局部变量,变量var2就是静态局部变量。所以在调用函数后,变量var1的值就会被清除,而变量var2的值就会被保留。如果我们多次调用函数,变量var1每次都会重新初始化,而变量var2的值则不会!这一特性有什么作用呢?我们可以用其来实现如计数一样的累计操作。
最后总结一下静态局部变量的特性:
存储位置:处于静态存储区,当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。
初始化操作:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)。
作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。但是静态局部变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对它进行访问。
有一点需要说明的是,由于静态局部变量在函数调用完毕后,其值并不会被销毁,所以拥有静态局部变量的函数是不可重入的。静态局部变量的使用还是谨慎一些为好。

2、修饰全局变量
关键字static还可以用于修饰全局变量,该变量是在某一个模块中的变量,但不属于任何一个函数内,这样的变量通常被称为静态全局变量。这样一个变量可以被此模块内所有的函数访问,但不能被其他模块内的函数访问。
那么定义这样一个静态全局变量的用处何在呢?我们觉得最明显的优点主要是两点:
是一个模块内的变量,避免其它的模块来访问和修改,因为有时候我们不想它被别人访问。
另一点,由于有效区域的限制,所以在其它模块中可以使用相同名字的变量,而不会发生冲突,使软件编写更方便。
最后总结一下静态全局变量的特性,特别需要注意其作用域,可与静态局部变量作比较。
存储位置:和静态局部变量一样也处于内存中的静态存储区,而静态存储区在整个程序运行过程中是一直存在的。
初始化操作:未经初始化的局部静态变量会被程序自动初始化为0,而自动对象的值是任意的,除非他被显示初始化。
作用域:静态全局变量在声明它的模块之外是不可见的,所以他的作用域就在其所属模块,更确切的说是从定义之处开始到模块结尾处。
所以,当使用static用来修饰全局变量时,它就将全局变量的作用域限定在了声明它的模块之内,但是并不会改变它的存放位置,还是在静态存储区中。

3、修饰函数
关键字static还可以用于修饰一个函数,这样的函数称为静态函数。在一个模块内,一个被声明为静态的函数只可被该模块内的其他函数调用,也就是说,这个函数的使用范围被限制在声明它的模块之内。
关键字static,译成中文就是“静态的”,所以内部函数又称静态函数。但此处static的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
定义一个静态函数就是在函数的返回类型前加上static关键字。一般函数的定义和声明默认情况下是extern的,但是静态函数只是在声明它的模块中可见,不能被其他模块调用。定义一个静态函数如下:
static void function(void)
{
//函数体
}
那么定义静态函数有什么好处呢?与静态全局变量一样,我们觉得最明显的优点主要是两点:
一点是,静态函数是一个本地函数,不可以被其它模块的函数调用,方便封装一些模块内部属性的功能。
另一点,由于有效区域的限制,所以在其它模块中可以使用相同名字的函数,而不会发生冲突,使软件编写更方便。

总结:我们在这里讨论static关键字,其最大的好处是能够实现数据和操作的封装,这种封装实际上就是限定数据和函数的作用范围,但是限定作用范围又有什么用呢?
首先,能够传递给使用者所需要的属性和操作信息,约束数据和操作的作用范围;
其次,隐藏某些不必要对外公开的信息,而需要公开的信息公开,使得调用者更明晰其特性,且使得调用更为安全;
再者,可以使得模块的封装性更好,结构更加紧凑和优化。

statis关键字的使用相关推荐

  1. java的this关键字理解

    1.java提供了一个this关键字,this关键字总是指向调用该方法的对象.根据this出现位置的不同,this作为对象的默认引用有两种情形. a).构造器中引用该构造器正在初始化的对象.(this ...

  2. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  3. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  4. volatile关键字之全面深度剖析

    引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  5. mysql屏蔽关键字实现方法_PHP屏蔽过滤指定关键字的方法

    本文实例讲述了PHP屏蔽过滤指定关键字的方法.分享给大家供大家参考.具体分析如下: 实现思路: 一.把关键字专门写在一个文本文件里,每行一个,数量不限,有多少写多少. 二.PHP读取关键字文本,存入一 ...

  6. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  7. Java this 关键字使用

    this 引用就是本类的一个对象 理解这句话看下面一段代码 package me; public class Me {String name; //成员变量int age;public Me(Stri ...

  8. java 关键字(面试题)

    学而时习之,温故而知新. 今天群里有人问java中true ,false 是关键字吗, 这里记录下,不是关键字,我还特意翻看之前的书看看 下面是 Java 语言保留使用的 50 个关键字: 关键字 g ...

  9. java中标识符,关键字,数据类型

    什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...

最新文章

  1. 苹果菠萝笔html5游戏在线玩,苹果菠萝笔游戏
  2. python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!
  3. 遵循Java EE标准体系的开源GIS服务平台之二:平台部署
  4. 「镁客·请讲」HelloEOS梓岑:嘻哈外表下的区块链式达尔文主义
  5. 用代理IP进行简单的爬虫——爬高匿代理网站
  6. linux快速迁移超大文件,Linux下快速迁移海量文件的操作记录
  7. 又一灵异事件 Delphi 2007 在 Win7
  8. 手持式频谱分析仪怎么选择
  9. 程序员在国外:在加拿大IT公司工作三年的一些感受
  10. 《从零开始做运营》心得
  11. 四色菊皇家大学 SiSaKet Rajabhat University (SSKRU)
  12. 40vf什么意思_什么是VF技术?
  13. 微信公众号如何上传附件(Word、Excel、Pdf、PPT),三步轻松实现
  14. echarts lengend格式化和换行
  15. 微信在线答题如何制作?
  16. Xcode7折叠与展开代码
  17. CentOS+Jenkins+docsify
  18. 全国企业信息网站地址
  19. Word处理控件Aspose.Words功能演示:在 Python 中比较两个 Word 文档
  20. 测试用例案例_淘宝购物车

热门文章

  1. Skiplist跳表详解及其模拟实现
  2. ps4变更账号服务器,ps4怎么变更账户邮箱-ps4更改账户邮箱的方法
  3. BZOJ1006神奇的国度
  4. JAVA:List复制
  5. 鹏辰教育:计算机初级职称信息处理技术员难吗?
  6. 埃拉托斯特尼(Eratosthene)筛法
  7. vue+springboot+阿里云短信服务(集成redis实现验证码登录业务)
  8. 小孩上楼梯的方式的种类
  9. python有趣小程序-搞几款由quot;Python”语言编写的quot;有趣、恶搞、好玩”的程序代码!...
  10. 记:psd中图标转成svg并上传到iconfont制作成图标