C语言中static变量详解

上传人:飞*** 文档编号:47799131 上传时间:2018-07-05 格式:PDF 页数:4 大小:127.12KB
返回 下载 相关 举报
C语言中static变量详解_第1页
第1页 / 共4页
C语言中static变量详解_第2页
第2页 / 共4页
C语言中static变量详解_第3页
第3页 / 共4页
C语言中static变量详解_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《C语言中static变量详解》由会员分享,可在线阅读,更多相关《C语言中static变量详解(4页珍藏版)》请在金锄头文库上搜索。

1、Static翻译出来是“静态”“静止”的意思,在C 语言中的意思其实和它 的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数。经 static修饰过后的变量或者函数的作用域或者存储域会发生变化,而由static 修饰的变量在初始值方面也会表现出static关键字的优势。想知道经static 修饰过后的变量或者函数的作用域或者存储域发生了什么变化吗,发生变化的原 因是什么吗?请大家继续往下看! 一、c 程序的内存分布 既然 static是用来修饰变量和函数的,而变量和函数又是组成c 程序必不 可少的, C程序的内存分布图如下。 C程序由下面 5 部分组成: 1)正文段 CPU执行的

2、机器指令部分;一个程序只有一个副本;只读, 防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)在程序中所有赋了初值的全局变量,存放 在这里。 3)非初始化数据段( bss 段)在程序中没有初始化的全局变量;内核 将此段初始化为 0。 4)栈增长方向:自顶向下增长;自动变量以及每次函数调用时所 需要保存的信息(返回地址;环境信息)。 5)堆动态存储区。是向高地址扩展的数据类型,是自下向上的扩展方 式。c 程序内存分布图 上面的 C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss 段或者 data 段,变量的存储域为什么会有所不同呢?其实原因很简单,说白了 就是与他们定

3、义在程序的不同地方,有没有static关键字修饰有关啦,定义在 不同的地方也说明了他们有着不同的作用域。 二、static修饰的变量 1. 全局静态变量在全局变量之前加上关键字static, 全局变量就被定义成为一个全局静 态变量。 1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存 在) 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动 对象的值是任意的,除非他被显示初始化) 3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲 从定义之处开始到文件结尾。 定义全局静态变量的好处: 不会被其他文件所访问,修改 其他文件中可以使用相同名字的变量,不会发生冲

4、突。 2. 局部静态变量 在局部变量之前加上关键字static, 局部变量就被定义成为一个局部静态变 量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的局部静态变量会被程序自动初始化为0(自动 对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束 的时候,作用域随之结束。 注:当 static用来修饰局部变量的时候,它就改变了局部变量的存储 位置, 从原来的栈中存放改为静态存储区。 但是局部静态变量在离开作用域之后, 并没有被销毁, 而是仍然驻留在内存当中, 直到程序结束, 只不过我们不能再对 他进行访问。 当 static用来修饰全

5、局变量的时候, 它就改变了全局变量的作用域 (在 声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储 区中。 三、Static修饰的函数 在函数的返回类型前加上关键字static,函数就被定义成为静态函数。 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文 件中可见,不能被其他文件所用。定义静态函数的好处:其他文件中可以定义相同名字的函数,不会发生冲突静态函数不能被其他文件所用。 存储说明符 auto,register,extern ,static,对应两种存储期:自动存 储期和静态存储期。 auto 和 register对应自动存储期。具有自动存储期

6、的变量在进入声明 该变量的程序块时被建立, 它在该程序块活动时存在, 退出该程序块时撤销。 关键字 extern和 static用来说明具有静态存储期的变量和函数。用 static声明的局部变量具有静态存储持续期 (static storage duration ),或静态范围(static extent )。 虽然 他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域 内。静态局部对象在程序执行到该对象的声明处时被首次初始化。 四、总结(1)第一个作用:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具 有全局可见性。为理解这句话,我举例来说明。我们要同

7、时编译两个源文件,一 个是 a.c ,另一个是 main.c 。下面是 a.c 的内容#include增加这条语句char a = A; / global variable void msg() printf(“Hellon“); 下面是main.c 的内容int main(void) extern char a; / extern variable must be d eclared before use printf(“%c “, a); (void)msg(); return 0; 程序的运行结果是:A Hello 你可能会问:为什么在a.c 中定义的全局变量a 和函数 msg能在 ma

8、in.c 中 使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性, 其它的源文件也能访问。 此例中, a是全局变量,msg是函数, 并且都没有加 static 前缀,因此对于另外的源文件main.c 是可见的。如果加了 static,就会对其它源文件隐藏。例如在a 和 msg的定义前加上 static,main.c 就看不到它们了。利用这一特性可以在不同的文件中定义同名 函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀, 对于函数来讲, static的作用仅限于隐藏,而对于变量,static还有下面两个 作用。(2)static的第二个作用是保持变

9、量内容的持久。存储在静态数据区的变 量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。 共有两种变量存储在静态存储区: 全局变量和 static变量,只不过和全局变量比起来, static 可以控制变量的可见范围,说到底static还是用来隐藏的。(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属 性,因为全局变量也存储在静态数据区。在静态数据区, 内存中所有的字节默认 值都是 0x00,某些时候这一特点可以减少程序员的工作量。最后对 static的三条作用做一句话总结。 首先 static的最主要功能是隐藏, 其次因为 static变量存放在静态存储区,所以它具备持久性和默认值0。下面是 main.c 的内容除了头文件,需要声明函数:void msg(); int main(void) extern char a; / extern variable must be d eclared before use printf(“%c “, a); (void)msg(); return 0;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号