在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。

静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。例如,全局变量虽然属于静态存储方式,但并不是静态变量,它必须由 static 加以定义后才能成为静态全局变量。

1、隐藏与隔离作用

上面已经阐述过,全局变量虽然属于静态存储方式,但并不是静态变量。全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。

如果我们希望全局变量仅限于在本源文件中使用,在其他源文件中不能引用,也就是说限制其作用域只在定义该变量的源文件内有效,而在同一源程序的其他源文件中不能使用。这时,就可以通过在全局变量之前加上关键字 static 来实现,使全局变量被定义成为一个静态全局变量。这样就可以避免在其他源文件中引起的错误。也就起到了对其他源文件进行隐藏与隔离错误的作用,有利于模块化程序设计。

2、保持变量内容的持久性

有时候,我们希望函数中局部变量的值在函数调用结束之后不会消失,而仍然保留其原值。即它所占用的存储单元不释放,在下一次调用该函数时,其局部变量的值仍然存在,也就是上一次函数调用结束时的值。这时候,我们就应该将该局部变量用关键字 static 声明为“静态局部变量”。

当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。

对某些必须在调用之间保持局部变量的值的子程序而言,静态局部变量是特别重要的。如果没有静态局部变量,则必须在这类函数中使用全局变量,由此也就打开了引入副作用的大门。使用静态局部变量最好的示例就是实现统计次数的功能,如下面示例所示。

#include <stdio.h>
void count();
int main(void)
{int i=0;for (i = 0;i <= 5;i++){count();}return 0;
}
void count()
{/*声明一个静态局部变量*/static num = 0;num++;printf("%d\n",num);

在该代码中,我们通过在 count() 函数里声明一个静态局部变量 num 来作为计数器。因为静态局部变量是在编译时赋初值的,且只赋初值一次,在程序运行时它已有初值。以后在每次调用函数时就不再重新赋初值,而是保留上次函数调用结束时的值。这样,count() 函数每次被调用的时候,静态局部变量 num 就会保持上一次调用的值,然后再执行自增运算,这样就实现了计数功能。同时,它又避免了使用全局变量。

通过上面的示例,我们可以得出静态局部变量一般的使用场景,如下所示:
(1)需要保留函数上一次调用结束时的值。
(2)如果初始化后,变量只会被引用而不会改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。

3、默认初始化为0

在静态数据区,内存中所有的字节默认值都是 0x00。静态变量与全局变量也一样,它们都存储在静态数据区中,因此其变量的值默认也为 0。演示示例如下所示

#include <stdio.h>
static int g_x;
int g_y;
int main(void)
{static int x;printf("g_x:%d\ng_y:%d\nx:%d",g_x,g_y,x);return 0;
}

运行结果为:
g_x:0
g_y:0
x:0

http://c.biancheng.net/view/301.html

C语言static变量详解相关推荐

  1. C语言中static变量详解

    google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...

  2. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  3. C语言 定义变量详解

    前言: 在我们上一次C的 printf函数和注释方法的解说中,我们了解了printf函数中第一变量和第二变量的类型必须一致,那今天我就带大家了深入解一下C语言中的变量. 一.定义变量 在C语言中,变量 ...

  4. php之static静态变量详解

    php之static静态变量详解 一.总结 把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期. 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围. 二.php之sta ...

  5. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  6. php的 静态变量,PHP之static静态变量详解

    在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...

  7. c语言path环境变量,Windows下PATH等环境变量详解(转载)

    在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问题是:有的学习者能够按照提示 ...

  8. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  9. 计算机科学类专升本复习之“C语言结构体”详解(初稿)

    C语言结构体详解,C语言struct用法详解 前面所学到的"数组":它是一组具有"相同类型"的数据的集合. 但是在实际的编程中,我们往往还需要 一组" ...

最新文章

  1. HDU 4300 Clairewd’s message
  2. PTA 基础编程题目集 7-33 有理数加法 C语言
  3. .NET Micro Framework动态调用C/C++底层代码(原理篇)
  4. MyBatis 一个数据持久层(ORM)框架
  5. 启动Jupyter Notebook时出现Kernel error错误的解决方法
  6. Linux下用FFMPEG采集usb摄像头到RTMP
  7. web浏览器进化简史
  8. Adobe Illustrator的教程等距购物移动应用程序
  9. 安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
  10. Spring Bean初始化的几种常规方式
  11. URL vs URI
  12. C/C++编程笔记:指针篇!从内存理解指针,让你完全搞懂指针
  13. ImportREC输入表重建工具
  14. 压缩包密码破解-PkCrack(明文攻击)
  15. 安卓开发(简单打开前置摄像头并显示)
  16. 二手房中介管理系统设计
  17. 由kobject_create_and_add全面了解kobject
  18. 联想7400pro打印有横黑道
  19. 基于盲估计和ICA的单通道盲分离算法–Matlab仿真
  20. 隐私计算--25--联邦学习激励机制

热门文章

  1. MacOS 驱动调试笔记
  2. ubuntu 安装 Python
  3. JS中数组和字符串的方法大全
  4. 【数值分析】学习笔记3——凸优化1:凸函数和凸优化问题
  5. c语言isnumber函数的使用方法,ISNUMBER函数介绍及用法
  6. Excel每隔2行间隔设定颜色,是表格更加直观好看
  7. 基于J2EE的互联网广告竞价系统
  8. Dagger学习 -- 基础概念
  9. 二十周岁的一篇小作文
  10. koom 源码分析之 koom-monitor-base