一、 static 变量

static变量大致分为三种用法
1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.
2. 用于全局变量,主要作用是限制此全局变量被其他的文件调用.
3. 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象

1. 静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义    它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

(2)允许对构造类静态局部量赋初值    例如数组,若未赋以初值,则由系统自动赋以0值。
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

举例如下:
int fun() {
    static int a = 1;
    a++;
}
在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1,以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:
int a = 1;
int fun() {
    a++;
}

2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

3.static的类成员变量

static关键字有两种意思,你看上下文来判断

a,表示变量是静态存储变量,表示变量存放在静态存储区.

b,表示该变量是内部连接(这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static),也就是说在其它的.cpp文件中,该变量是不可见的(你不能用).

二、static 函数    —— 内部函数和外部函数

当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。
1 内部函数(又称静态函数)
如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。
定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
static    函数类型    函数名(函数参数表)
{……}
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

2 外部函数
外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
[extern]    函数类型    函数名(函数参数表)
{……}
调用外部函数时,需要对其进行说明:
[extern]    函数类型    函数名(参数类型表)[,函数名2(参数类型表2)……];

[案例]外部函数应用。
(1)文件mainf.c
main()
{    extern void input(…),process(…),output(…);
input(…);    process(…);    output(…);
}

(2)文件subf1.c
……
extern    void input(……)                             /*定义外部函数*/
{……}
(3)文件subf2.c
……
extern    void process(……)                       /*定义外部函数*/
{……}
(4)文件subf3.c
……
extern void output(……)                          /*定义外部函数*/
{……}

static变量和static函数的用法摘抄相关推荐

  1. python static变量_python static变量

    python在函数中有static变量吗 python函数怎么实现static变量? python函数实现static变量具体如下:def ask_ok(prompt, retries=4, comp ...

  2. c语言中的static变量和static函数

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的修饰变量作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函 ...

  3. static变量、static函数与普通变量、普通函数的区别

    转自:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/ 全局变量(外部变量)的说明之前再冠以stati ...

  4. c语言中函数static变量,[转]C语言中的 static变量、static函数

    1. static 变量 静态变量的类型 说明符是 static. 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量. 例如外部变量虽属于静态 存储方式,但不一定是静态变量, ...

  5. php多线程 static变量,private static和public static的比较:多线程间

    private static和public static的比较,区别在于修改的范围不同,但作用域都是全局的即整个进程内共享,与具体线程无关. 以下是测试代码: 声明静态内部变量的抽象类 package ...

  6. C语言中的 static变量、static函数

    Static variable & function 1.Static variable 2.静态局部变量(static local variable) 3.静态全局变量(static glo ...

  7. static变量和static函数

    1.static全局变量和普通的全局变量 static全局变量在定义该变量的当前源文件内有效, 在同一源程序的其它源文件中不能使用它.而普通的全局变量在各个源文件中都是有效的(当一个源程序由多个源文件 ...

  8. static变量 static函数

    首先要明白c语言的存储空间 转自:http://www.52rd.com/blog/Detail_RD.Blog_imjacob_5297.html 一.c程序存储空间布局 C程序一直由下列部分组成: ...

  9. java中静态变量的作用_Java中static变量作用和用法详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

最新文章

  1. LDialog基于DialogFragment封装的库,也许是一个Nice的库
  2. 客户端用javascript填充Dropdownlist,服务器端获取不到Dropdownlist的值
  3. 看看别人家 SpringBoot 的全局异常处理,多么优雅....
  4. 学习记录:CONCAT()
  5. spring系列-注解驱动原理及源码-属性赋值
  6. 华为云服务器 大文件,云服务器上传大文件
  7. 画函数图形的C#程序(改进版) (转)
  8. 如果有一天,小夕不再萌...
  9. Oracle : ORA-02290: 违反检查约束条件
  10. linux 可以ping 通 windows ,windows ping 不了 linux
  11. pyspark--dataframe使用
  12. 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络
  13. oracle和mysql建表语句的区别_mysql和oracle建表语句的区别
  14. 笔记:PJL的一些用法
  15. virtualbox复制vdi
  16. 题解:《你的飞碟在这儿》、《哥德巴赫猜想》
  17. python marshal loads failed_Python模块学习:marshal 对象的序列化
  18. 如何查看浏览器http请求协议
  19. 吉林大学考研计算机科学与技术,2022年吉林大学计算机科学与技术学院考研初试科目调整通知...
  20. Qt基于QGraphicsView 实现四个教具之一直尺(一)

热门文章

  1. jQuer实时监控input对table进行筛选
  2. 同一路由带参刷新,以及params和query两种方式传参的异同
  3. CSS文件的三种引入方式
  4. Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?
  5. linux中pip安装步骤与使用详解
  6. 前端开发不容错过的jQuery图片滑块插件(转)
  7. linux通过mail命令发送到外部邮件
  8. RouterOS计划任务实例
  9. SQL Server 中的执行计划和SQL Server Profiler
  10. VGA接口一根针折了