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. 只要部分主动变量和体式格局参数才可以界说为寄放器变量。因为寄放器变量属于静态存储举措。凡需求采用静态存储举措的量不克不及界说为寄放器变量。

2. 在Turbo C,MS C等微机下利用的C措辞中, 理论上是把寄放器变量当成主动变量处置的。是以速度并不克不及提高。 而在措施中许愿利用寄放器变量只是为了与规范C对峙分歧。3. 纵然能真正利用寄放器变量的板滞,因为CPU 中寄放器的个数是有限的,是以利用寄放器变量的个数也是有限的。



版权声明: 原创作品,许愿转载,转载时请务必以超链接体式格局标明文章 原始因由 、作者信息和本声明。不然将追查法令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975596.html