C语言学习及应用笔记之二:C语言static关键字及其使用
C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些。我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂。
一般来说static关键字的常见用法有三种:一是用作局部变量的修饰符;二是用作全局变量修饰符;三是用作函数修饰符。在本篇接下来的描述中,我们将详细分析这三种用法。
1、用于局部变量的修饰
当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关键字。一般函数的定义和声明默认情况下是extern的,但是静态函数只是在声明它的模块中可见,不能被其它模块调用。定义一个静态函数如下:
static void function(void)
{
//函数体
}
那么定义静态函数有什么好处呢?与静态全局变量一样,我们觉得最明显的优点主要是两点:
- 一点是,静态函数是一个本地函数,不可以被其它模块的函数调用,方便封装一些模块内部属性的功能。
- 另一点,由于有效区域的限制,所以在其它模块中可以使用相同名字的函数,而不会发生冲突,使软件编写更方便。
4、总结
我们在这里讨论static关键字,其最大的好处是能够实现数据和操作的封装,这种封装实际上就是限定数据和函数的作用范围。可能有人会问限定作用范围有什么用呢?
首先,能够传递给使用者所要的属性和操作信息,约束数据和操作的作用范围。
其次,隐藏某些不必要对外公开的信息,而需要公开的信息公开,使得调用者更明晰其特性,且使调用更为安全。
再者,可以使得模块的封装性更好,结构更加紧凑和优化。
事实上,在面向对象的语言中,封装对象的属性和操作,并注重属性和操作的私有和公共,也是基于这一思想,不过更完备罢了。
欢迎关注:

C语言学习及应用笔记之二:C语言static关键字及其使用的更多相关文章
- C语言学习及应用笔记之五:C语言typedef关键字及其使用
在C语言中有一个typedef关键字,其用来定义用户自定义类型.当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名.总之,可以使用typede ...
- C语言学习及应用笔记之七:C语言中的回调函数及使用方式
我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题.但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析. 1.什么是回调函数 ...
- C语言学习及应用笔记之三:C语言const关键字及其使用
在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图. 事实上,无论我 ...
- C语言学习及应用笔记之六:C语言extern关键字及其使用
在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义.extern关键字的用法有几种,我们下面对其进 ...
- C语言学习及应用笔记之四:C语言volatile关键字及其使用
在C语言中,还有一个并不经常使用但却非常有用的关键字volatile.那么使用volatile关键字究竟能干什么呢?接下来我将就此问题进行讨论. 一个使用volatile关键字定义变量,其实就是告诉编 ...
- hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse
生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...
- C语言学习及应用笔记之一:C运算符优先级及使用问题
C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多.这些运算符有单目运算符.双目运算符以及三目运算符,又涉及到左结合和 ...
- C语言学习书籍推荐《学通C语言的24堂课》下载
下载地址:点我 编辑推荐 <学通C语言的24堂课>:用持续激励培养良好习惯以良好习惯铸就伟大梦想——致亲爱的读者朋友在开始学习<学通C语言的24堂课>的同时,强烈建议读者朋友同 ...
- C 语言学习的第 05 课:C 语言基础(01)
C语言程序中的绝大部分应该记录在以.c作为扩展名的文件里,这种文件叫做C语言 程序的源文件. C语言中还包括以.h作为扩展名的文件,这种文件叫做头文件. C语言中的四则运算: 加:+ 减:- 乘 ...
随机推荐
- win10和Ubuntu双系统安装过程中遇到的问题
1.安装过程 注意分区问题,很重要 https://blog.csdn.net/baobei0112/article/details/77996570 https://blog.csdn.net/s7 ...
- 第27月第17天 objc_msgSendSuper
1.objc_msgSendSuper super 的含义,消息转发会调用 objc_msgSendSuper, 就是 去父类的方法列表中找到 initWithFrame:这个方法,然后调用,调用的主 ...
- BZOJ4921「Lydsy1706月赛」互质序列
吐槽一下BZOJ没有C++11 题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...
- Leetcode#561. Array Partition I(数组拆分 I)
题目描述 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最 ...
- 【CentOS】JDK的安装
FTP文件上传方式(推荐) # 解压 tar zxvf jdk-9_linux-x64_bin.tar.gz # 修改profile文件 sudo vi /etc/profile # 在文件结尾添加如 ...
- 用例该如何书写?完整示例-QQ登录界面
测试用例(case\测试点):指导软件测试工程师找bug的(思想逻辑的整理) 意义:1:怕忘:2:存档(让新人熟悉:产出):3:回归测试(软件即将上线之前,重新执行测试用例)--确认测试 书写测试用例 ...
- Python学习-环境搭建(IronPython)
一.IDE环境 VS2013 下安装 PTVS 2.2.2 VS 2013 VS2015 已经集成了Python的开发环境 二.安装 IronPython 下载地址:http://ironpytho ...
- PHP反序列化漏洞学习
serialize:序列化 unserialize: 反序列化 简单解释: serialize 把一个对象转成字符串形式, 可以用于保存 unserialize 把serialize序列化后的字符串变 ...
- 【转】Vim速查表-帮你提高N倍效率
Vim速查表-帮你提高N倍效率 转自:https://www.jianshu.com/p/6aa2e0e39f99 去年上半年开始全面使用linux进行开发和娱乐了,现在已经回不去windows了. ...
- 利用Linux系统生成随机密码的10种方法【转】
Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...