C语言进修教程第五章-函数(9)
当前位置:以往代写 > C/C++ 教程 >C语言进修教程第五章-函数(9)
2019-06-13

C语言进修教程第五章-函数(9)

C语言进修教程第五章-函数(9)

三、静态变量

静态变量的范例说明符是static。 静态变量虽然是属于静态存储方法,可是属于静态存储方法的量不必然就是静态变量, 譬喻外部变量虽属于静态存储方法,但不必然是静态变量,必需由 static加以界说后才气成为静态外部变量,或称静态全局变量。 对付自动变量,前面已经先容它属于动态存储方法。 可是也可以用static界说它为静态自动变量,或称静态局部变量,从而成为静态存储方法。
由此看来, 一个变量可由static举办再说明,并改变其原有的存储方法。

1. 静态局部变量
在局部变量的说明前再加上static说明符就组成静态局部变量。
譬喻:
static int a,b;
static float array[5]={1,2,3,4,5};

静态局部变量属于静态存储方法,它具有以下特点:
(1)静态局部变量在函数内界说,但不象自动变量那样,当挪用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的保留期为整个源措施。

(2)静态局部变量的保留期固然为整个源措施,可是其浸染域仍与自动变量沟通,即只能在界说该变量的函数内利用该变量。退出该函数后, 尽量该变量还继承存在,但不能利用它。

(3)答允对结构类静态局部量赋初值。在数组一章中,先容数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。

(4)对根基范例的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 按照静态局部变量的特点, 可以看出它是一种保留期为整个源措施的量。固然分开界说它的函数后不能利用,但如再次挪用界说它的函数时,它又可继承利用, 并且生存了前次被挪用后留下的值。 因此,当多次挪用一个函数且要求在挪用之间保存某些变量的值时,可思量回收静态局部变量。固然用全局变量也可以到达上述目标,但全局变量有时会造成意外的副浸染,因此仍以回收局部静态变量为宜。
[例5.15]main()
{
int i;
void f(); /*函数说明*/
for(i=1;i<=5;i++)
f(); /*函数挪用*/
}
void f() /*函数界说*/
{
auto int j=0;
++j;
printf("%d\n",j);
}
措施中界说了函数f,个中的变量j 说明为自动变量并赋予初始值为0。当main中多次挪用f时,j均赋初值为0,故每次输出值均为1。此刻把j改为静态局部变量,措施如下:
main()
{
int i;
void f();
for (i=1;i<=5;i++)
f();
}
void f()
{
static int j=0;
++j;
printf("%d\n",j);
}
void f()
{
static int j=0;
++j;
printf("%d/n",j);
}
由于j为静态变量,能在每次挪用后保存其值并在下一次挪用时继承利用,所以输出值成为累加的功效。读者可自行阐明其执行进程。

2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就组成了静态的全局变量。全局变量自己就是静态存储方法, 静态全局变量虽然也是静态存储方法。 这两者在存储方法上并无差异。这两者的区别虽在于非静态全局变量的浸染域是整个源措施, 当一个源措施由多个源文件构成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其浸染域, 即只在界说该变量的源文件内有效, 在同一源措施的其它源文件中不能利用它。由于静态全局变量的浸染域范围于一个源文件内,只能为该源文件内的函数公用, 因此可以制止在其它源文件中引起错误。从以上阐明可以看出, 把局部变量改变为静态变量后是改变了它的存储方法即改变了它的保留期。把全局变量改变为静态变量后是改变了它的浸染域, 限制了它
的利用范畴。因此static 这个说明符在差异的处所所起的浸染是差异的。应予以留意。

四、寄存器变量

上述种种变量都存放在存储器内, 因此当对一个变量频繁读写时,必需要重复会见内存储器,从而耗费大量的存取时间。 为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,利用时,不需要会见内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对付轮回次数较多的轮回节制变量及轮回体内重复利用的变量均可界说为寄存器变量。
[例5.16]求∑200i=1imain()
{
register i,s=0;
for(i=1;i<=200;i++)
s=s+i;
printf("s=%d\n",s);
}
本措施轮回200次,i和s都将频繁利用,因此可界说为寄存器变量。
对寄存器变量还要说明以下几点:

1. 只有局部自动变量和形式参数才可以界说为寄存器变量。因为寄存器变量属于动态存储方法。凡需要回收静态存储方法的量不能界说为寄存器变量。

#p#分页标题#e#

2. 在Turbo C,MS C等微机上利用的C语言中, 实际上是把寄存器变量当成自动变量处理惩罚的。因此速度并不能提高。 而在措施中答允利用寄存器变量只是为了与尺度C保持一致。3. 纵然能真正利用寄存器变量的呆板,由于CPU 中寄存器的个数是有限的,因此利用寄存器变量的个数也是有限的。

    关键字:

在线提交作业