c 语言中的关键字static

转载 2016年06月01日 15:29:02

Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数

1、Static修饰变量

按照作用范围的不同,变量分为局部变量全局变量。如果用static修饰变量,不论这个变量是全局的还是局部的都是存储在静态数据区。下面分开来讲:

¨          如果用static修饰全局变量,我们称其为静态全局变量。

我们用static修饰全局变量的主要目的就是:使得其作用域仅限于变量被定义的文件中(即从变量定义处到本文件结尾处),其它文件不论通过什么方式都不能访问。

¨          如果用static修饰局部变量,我们称其为静态局部变量。

我们用static修饰局部变量的目的主要有两个:

1)         在某个函数体里面定义的静态局部变量,只能在本函数体被访问,即使同一个文件的其它函数也访问不了。

2)         静态局部变量总存储在静态数据区,所以即使这个函数运行结束,这个静态局部变量的值不会被销毁,函数下次使用时仍然要用到这个值。

 

下面给出一个例程:


 

#include <stdio.h>

 

static int j;  // 静态全局变量

int fun1(void)

{

         static int i = 0;

         i++;

         return i;

}

 

int fun2(void)

{

         j = 0;

         j++;

         return j;

}

 

int main(int argc, char *argv[])

{

         int k = 0, m = 0, n = 0;

         for(k=0; k<10; k++){

                   m = fun1( );

                   n = fun2( );

                   printf("%d,%d\n", m, n);

         }

         return 0;

}

 

结果:

1,1

2,1

3,1

4,1

5,1

6,1

7,1

8,1

9,1

10,1

 

从例程的运行结果可以看出:

对于fun1( ),运行一次之后,变量i保持了原来的数据,并没有销毁,而是在下一次调用的时候继续使用,所以才会有1、2、3…10这样的结果。而对于fun2( ),运行一次之后,变量j的值被销毁了,所以第二次调用结束j仍然保持原值“1”,所以循环十次,每次都是1

 

2、Static修饰函数

在函数前加static,则此函数成为静态函数(内部函数),我们用static修饰函数的主要目的是:用来表示不能被其它文件访问的一个函数(和用static修饰全局变量的目的一样,都是不允许其它文件访问)。这样一来便有一个好处:程序员不用担心自己编写的函数与其他文件的函数同名

 

 

对局部静态变量的特别说明

(1)静态局部变量数据属于静态存储类别,在静态存储区内分配内存单元,在整个程序运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占用静态存储区空间,函数调用结束后立即释放空间。

(2)静态局部变量时在编译时被赋值的,即自始至终只赋值一次,在程序运行时它已经有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而自动变量赋初值,不是在编译时进行的,而是在运行时进行,所以每调用一次函数就赋一次初值。

(3)如在定义局部变量时不赋初值,则对静态局部变量来说,编译时自动赋一个初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由每次动态分配的内存单元不同所决定的。

C语言中static关键字的作用

在C语言中static的作用如下 第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 第二、static修饰全局变量的...
  • newcong0123
  • newcong0123
  • 2016年10月02日 23:05
  • 21788

对C语言中的static关键字的深入理解

通过对static关键字的解析,讲述了其背后与编译,链接相关的原理。
  • on_1y
  • on_1y
  • 2014年04月22日 09:53
  • 13667

C和C#中static关键字的作用

C中: 1. static 变量   静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但...
  • li758568825
  • li758568825
  • 2013年11月11日 16:48
  • 1393

Static 关键字在 C 语言中的作用

static作用:“改变生命周期” 或者 “改变作用域”   程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。 1.作用于变量:    用...
  • u011263794
  • u011263794
  • 2015年09月08日 15:01
  • 317

C 语言-static和extern关键字2-对变量的作用

本文目录 一、在Java中,全局变量的定义没有严格的位置规定二、在C语言中,全局变量定义的位置是有限制的三、重复定义同一个变量四、不同源文件中的同名变量五、static关键字六、static和e...
  • smxueer
  • smxueer
  • 2014年10月10日 18:05
  • 400

c 语言static 关键字用法

C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互...
  • cindywry
  • cindywry
  • 2017年12月27日 17:24
  • 44

C 语言中 auto/static/register/extern 的区别

C中的auto、static、register和extern的区别 C语言中的每一个变量和函数有两个属性:数据类型和数据的存储类别。数据类型(整形、字符型等),存储类别是指数据在内存中存储的方法,...
  • Jeremy_Yuan
  • Jeremy_Yuan
  • 2017年02月20日 21:09
  • 303

C 语言中的static

Static 在C语言中,关键字static有三个明显的作用: 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模...
  • JCRunner
  • JCRunner
  • 2015年03月21日 10:24
  • 315

C 语言之 const、static小结

我们都知道有 const 修饰时,就意味着是只读不可修改的。 那么如下的一些声明又是表达什么意思呢? const int a; int const a; const int *a; int * con...
  • ShenYuanLuo
  • ShenYuanLuo
  • 2016年04月14日 21:02
  • 316

c 语言 : 局部变量 、全局变量、static变量 register变量 总结(更新)

添加对函数中的静态变量理解,函数中的静态变量可以实现统计函数的调用次数,而不必担心被意外修改。 #include const int file_scope_const_var = 10...
  • yefengxuelang
  • yefengxuelang
  • 2013年05月17日 16:12
  • 740
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c 语言中的关键字static
举报原因:
原因补充:

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