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(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由每次动态分配的内存单元不同所决定的。

相关文章推荐

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

static作用:“改变生命周期” 或者 “改变作用域”   程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。 1.作用于变量:    用...

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

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

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

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

C 语言中的static

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

C 语言之 const、static小结

我们都知道有 const 修饰时,就意味着是只读不可修改的。 那么如下的一些声明又是表达什么意思呢? const int a; int const a; const int *a; int * con...

c 语言里inline一般不单独使用,而是和static inline联合使用

转载地址:http://blog.chinaunix.net/uid-26285146-id-3225668.html 今天在看HAL层的头文件的时候,看到static inline int sen...

黑马程序员----C 语言学习笔记之枚举类型和typedef关键字

------Java培训、Android培训、iOS培训、.Net培训-------- 一、枚举类型介绍及定义 在实际问题中有许多可能出现的属性有固定的值,例如一年的12个月,十二生肖,一年四...

C 语言中 typeof 关键字简介

原文:http://hi.baidu.com/leowang715/blog/item/b0b96d6f972e7dd080cb4a06.html typeof关键字是C语言中的...

一起talk C栗子吧(第一百二十六回:C语言实例--static关键字)

各位看官们,大家好,上一回中咱们说的内置宏的例子,这一回咱们说的例子是:static关键字。闲话休提,言归正转。让我们一起talk C栗子吧!
  • talk_8
  • talk_8
  • 2016-03-20 21:27
  • 1173

C语言关键字之static

C语言关键字之static               参考资料:http://topic.csdn.net/u/20101221/22/a4fdc6a1-2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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