在C编程中使用到的几个重要关键字之一static

关于static,我只是把与C相关的摘录了下来,其中C++中与C中类似的,写了出来,关于类中的使用就忽略了。

 

C++的static有两种用法:面向过程程序设计中的static和 面向对象程序设计 中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

面向过程设计中的static

  1、静态全局变量
  在全局变量前,加上 关键字 static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:
  //Example 1
  #include <iostream.h>
  void fn();
  static int n; //定义静态全局变量
  void main()
  { n=20;
  cout<<n<<endl;
  fn();
  }
  void fn()
  { n++;
  cout<<n<<endl;
  }
  静态全局变量有以下特点:
  该变量在全局数据区分配内存;
  未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
  静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
   静态变量 都在全局数据区分配内存,包括后面将要提到的静态 局部变量 对于一个完整的程序,在内存中的分布情况如下图:
  代码区 //low address
  全局数据区
  堆区
  栈区 //high address
  一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静 态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将
  static int n; //定义静态全局变量
  改为
  int n; //定义全局变量
  程序照样正常运行。
  的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:
  静态全局变量不能被其它文件所用;
  其它文件中可以定义相同名字的变量,不会发生冲突;
  您可以将上述示例代码改为如下:
  //Example 2//File1
  #include <iostream.h>
  void fn();
  static int n; //定义静态全局变量
  void main()
  { n=20;
  cout<<n<<endl;
  fn();
  }
  //File2
  #include <iostream.h>
  extern int n;
  void fn()
  { n++;
  cout<<n<<endl;
  }
  编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。 试着将
  static int n; //定义静态全局变量
  改为
  int n; //定义全局变量
  再次编译运行程序,细心体会全局变量和静态全局变量的区别。
  注意:全局变量和全局静态变量的区别
  1)全局变量是不显式用static修饰的全局变量,但全局变量默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
  2)全局静态变量是显式用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。
  2、静态局部变量
  在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。
  我们先举一个静态局部变量的例子,如下:
  //Example 3
  #include <iostream.h>
  void fn();
  void main()
  { fn();
  fn();
  fn();
  }
  void fn()
  { static int n=10;
  cout<<n<<endl;
  n++;
  }
  通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
  但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
  静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
  静态局部变量有以下特点:
  该变量在全局数据区分配内存;
  静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
  静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
  它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
  3、 静态函数
  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用
  静态函数的例子:
  //Example 4
  #include <iostream.h>
  static void fn();//声明静态函数
  void main()
  {
  fn();
  }
  void fn()//定义静态函数
  { int n=10;
  cout<<n<<endl;
  }
  定义静态函数的好处:
  静态函数不能被其它文件所用;

  其它文件中可以定义相同名字的函数,不会发生冲突;

C中的static函数

分类

  static 函数内部函数和外部函数

  当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

内部函数

  (又称静态函数)

  如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。

  定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:

  static 函数类型 函数名(函数参数表)

  {……}

  关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。

  使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

外部函数

  外部函数的定义:在定义函数时,如果没有加关键字“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(……) /*定义外部函数*/

  {……}

 

出处:http://baike.baidu.com/view/536145.htm#2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值