C语言关于static的解析

C语言关于static的解析

#include<stdio.h>

static int j;

void fun1(void)

{

  int i = 0;

i ++;

}

void fun2(void)

{

j = 0;

j++;

}

int main()

{

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

 {

fun1();

fun2();

 }

getchar();

return 0;

}

结果:i=10j=1

 

C语言中,static关键字有三种用途:

1 用于全局变量定义时。

全局变量定义时加上static修饰,表示该变量为静态全局变量。作用域为当前文件。

2 用于函数定义或声明。

任意函数的定义或声明中包含了static修饰,表示该函数为静态函数,只能在本文件中被调用。

3 用于局部变量定义。

局部变量定义时,带有static关键字,表示其为静态局部变量,只被初始化一次,之后每次调用函数时,该变量值为上次函数退出时的值。即,改变量的生存周期被扩展到整个程序运行时间段内。

 

 

定义并初始化和定义之后再赋值,有区别的:

static int i = 0;//定义变量并初始化,只执行一次赋值

static int j;

j=0; //赋值语句,每次都执行

 

static int i = 0;这个只是定义和初始化,由于是static的,所以第一次执行到这里时,回去定义和初始化,但是之后再到这里时,发现已经定义过了,所以不会再定义,这样也就不会初始化。这个是static的运行机制。

 

 

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

1Static修饰变量

按照作用范围的不同,变量分为局部变量和全局变量。如果用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保持了原来的数据,并没有销毁,而是在下一次调用的时候继续使用,所以才会有12310这样的结果。而对于fun2( ),运行一次之后,变量j的值被销毁了,所以第二次调用结束j仍然保持原值“1”,所以循环十次,每次都是1

 

 

2Static修饰函数

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏波.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值