http://blog.csdn.net/woxiaohahaa/article/details/51014224

参考自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html (华山大师兄)

这里我们只讨论了C语言的static


首先我们回顾一下各种变量在内存中的位置:

BSS和DATA段都属于静态数据区,在进程运行过程中,静态数据区的数据始终存在。静态全局变量和其他全局变量的存储地点没有区别,因此还是在BSS和DATA中。但是,静态全局变量仅在定义它的源文件中有效,其他文件即使用extern声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。

1、静态的全局变量和函数

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

举个例子:

[cpp] view plaincopy
  1. //a.c
  2. #include <stdio.h>
  3. char a = 'A';               // global variable
  4. void msg()
  5. {
  6. printf("Hello\n");
  7. }
[cpp] view plaincopy
  1. //a.h
  2. #ifndef _A_H_
  3. #define _A_H_
  4. extern char a;
  5. void msg();
  6. #endif
[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include "a.h"
  3. //b.c
  4. int main()
  5. {
  6. printf("%c ", a);
  7. msg();
  8. return 0;
  9. }

以上代码成功编译连接后,输出 A Hello。

我们知道,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件b.c是可见的。

但是,如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,b.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名全局变量,而不必担心命名冲突。

2、静态的局部变量

static局部变量在函数内定义,它的生存期为整个程序运行过程,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

举个例子:

[cpp] view plaincopy
  1. #include <stdio.h>
  2. int fun(){
  3. static int count = 10;       //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
  4. return count--;              //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:
  5. }
  6. int count = 1;
  7. int main(void)
  8. {
  9. printf("global\t\tlocal static\n");
  10. for(; count <= 10; ++count)
  11. printf("%d\t\t%d\n", count, fun());
  12. return 0;
  13. }

输出如下:

基于以上两点,我们得出:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

3、未手动初始化的static变量和全局变量默认初始化为0

未手动初始化的static变量和全局变量都存储在 BSS 段,该区域的变量的值都为0。

某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘\0’;不妨做个小实验验证一下。

[cpp] view plaincopy
  1. #include <stdio.h>
  2. int a;
  3. int main()
  4. {
  5. int i;
  6. static char str[10];
  7. printf("integer: %d; string: (begin)%s(end)", a, str);
  8. return 0;
  9. }

运行结果为:integer: 0; string: (begin) (end)

【C/C++】关键字static相关推荐

  1. C语言的一个关键字——static

    C语言的一个关键字--static Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用stati ...

  2. C语言复习之关键字static的作用

    关键字static有三个明显的作用,简而言之就是: 1)如果修饰局部变量,改变局部变量的生存周期: 2)如果修饰全局变量和函数,改变其作用域(作用域由原来的整个工程变为在本文件内).

  3. 关键字static、const、volatile的作用

    关键字static的作用是什么?这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1.在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2. 在模 ...

  4. C/C++关键字 static 和 const

    C/C++关键字 static 和 const 一.关键字static 参考:https://www.cnblogs.com/BeyondAnyTime/p/2542315.html 1. 静态全局变 ...

  5. C语言关键字static与extern的详细解释

    参考原文地址(static):https://blog.csdn.net/keyeagle/article/details/6708077 参考原文地址(extern):https://www.cnb ...

  6. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  7. java 如何调用static_java 关键字static详细介绍及如何使用

    java 关键字static 详解 一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概念,在Java中stati ...

  8. 第十节(this关键字 static关键字)

    this 关键字:是指当前调用的对象,如果有 100 个对象,将有 100 个 this 对象指向各个对象this 关键字可以使用在:1. 当局部变量和成员变量重名的时候可以使用 this 指定调用成 ...

  9. 深入分析Java中的关键字static

    深入分析Java中的关键字static 一.static关键字的基本用法 1.static关键字基本概念 方便在没有创建对象的情况下来进行调用.也就是说:被static关键字修饰的不需要创建对象去调用 ...

  10. Java关键字static

    Java关键字static static表示静态的或者全局的,只能用来修饰变量.方法或方法块.它表示被修饰的内容在一定范围内是可以共享的. static修饰变量 static修饰的变量如果权限为pub ...

最新文章

  1. 记录Linux下的钓鱼提权思路
  2. nginx 访问日志分析工具 goacess
  3. linux下多种锁的比较
  4. java并发调用_Java并发教程–可调用,将来
  5. android 首页广告显示不出来的,android – Admob插页式广告(全屏)不会显示
  6. .net 实现微信公众平台的用户信息获取
  7. 修改Jupyter Notebook的默认路径
  8. snownlp 原理_使用snownlp进行情感分析
  9. 某企业通达OA任意登录漏洞复现
  10. 无需任何插件,教你影像如何精准导入CAD软件进行绘图?
  11. Tegra X2 系统上安装 openpose
  12. Latex编辑器Texstudio的注释快捷键。
  13. ArcGIS如何获取地理要素的几何属性
  14. 51nod 1299 监狱逃离 树形dp
  15. iOS 4.2.1版iPad绿毒Win完美越狱教程
  16. Filecoin投资者自白:我承认含有赌的成分
  17. smartctl获取raid卡下intel ssd寿命
  18. openmp配置指南_/openmp (启用 OpenMP 支持)
  19. python opencv 数米粒
  20. 95epay支付通道种类:3D通道,实时非3D通道,高级延时非3D通道,高级实

热门文章

  1. android使用bintray发布aar到jcenter
  2. javascript数据结构-栈
  3. 安卓TCP通信版本2
  4. 报错Unable to resolve target android-5
  5. ios 内存使用陷阱
  6. qt 试用 (3)配置编译源代码及调试
  7. string类有可以调换方向的函数吗_String类中常用的操作
  8. 计算机扬天m400c联想,【联想扬天M参数】联想扬天M系列台式电脑参数-ZOL中关村在线...
  9. linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告
  10. mysql从表截取信息_mysql中循环截取用户信息并插入到目标表对应的字段中