static变量和static函数的用法摘抄

转载 2012年03月26日 10:27:41
一、 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函数的用法摘抄

一、 static 变量static变量大致分为三种用法1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他的文...
  • chjun522
  • chjun522
  • 2007年12月21日 14:48
  • 402

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

转自:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/全局变量(外部变量)的说明之前再冠以static...
  • lcwyan
  • lcwyan
  • 2016年12月08日 13:46
  • 4530

C语言函数内static关键字详解

static关键字有两类使用:函数外使用和和函数内使用,其中函数外使用主要用来限制被修饰的函数或变量作用域为本文件,没什么可多说的,下面重点说一下static关键字在函数体内的用法....
  • liutgnukernel
  • liutgnukernel
  • 2016年05月21日 20:29
  • 1433

C++ 在函数中用static定义的变量的

在C++中,在函数中使用static定义一个变量,该变量最终只会分配一次内存,如果下次继续调用该函数,不会再重新分配内存给变量,而是使用上次分配的内存。#include using namespace...
  • Linkhai
  • Linkhai
  • 2015年11月18日 17:34
  • 1327

C/C++---static函数,static成员函数,static变量,static成员变量 再来理一理

首先说一下内存的五个区: 栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值(除static),其操作方式类似于数据结构中的栈。 堆(heap):一般由程序员分配释放,若程序员不...
  • FreeApe
  • FreeApe
  • 2016年03月25日 14:23
  • 1946

成员函数内定义static变量

在成员函数内定义static变量
  • u012317833
  • u012317833
  • 2014年11月11日 15:21
  • 1724

static 方法和static 变量

static方法不能直接访问类内的非static变量和不能调用this,super语句分析     大家都知道在static方法中,不能访问类内非static成员变量和方法。可是原因是什么呢?    ...
  • lei1160427600
  • lei1160427600
  • 2016年07月14日 16:51
  • 1437

关于static和可重入函数

1、概述   static 声明的变量在C语言中有两方面的特征:   1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 ...
  • gj19890923
  • gj19890923
  • 2013年06月03日 21:59
  • 2483

C语言中static关键词使用在函数外部和内部的疑惑

C语言static使用过程的一些疑惑在编写嵌入式的程序时,常常遇到static去修饰函数和变量,有时候就很迷惑修饰作用,下面是一点心得记录下来:一、修饰函数假设我们有a.c和b.c两个文件,fun1函...
  • xiaobai2458
  • xiaobai2458
  • 2016年07月11日 14:06
  • 1507

static变量和static函数的用法

一、 static 变量 static变量大致分为三种用法1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他的...
  • jlzhaozhifang
  • jlzhaozhifang
  • 2009年10月24日 19:56
  • 167
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:static变量和static函数的用法摘抄
举报原因:
原因补充:

(最多只允许输入30个字)