什么是c语言函数
)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 () )
{
静态输入j=0;
j;
printf(%d(n ),j );
}
void f () )
{
静态输入j=0;
j;
printf('%d/n ',j );
}
由于j是静态变量,因此输出值是累积的,因为可以在每次调用时保留值,并在下一次调用时继续使用。 读者可以自己分析其执行过程。
2 .静态全局变量
在说明全局变量(外部变量)之前冠上静态就构成了静态全局变量。 全局变量本身是静态存储方法,静态全局变量当然也是静态存储方法。 两种保存方法都没有区别。 不同之处在于,非静态全局变量的范围是整个源程序,但如果一个源程序由多个源文件组成,则非静态全局变量在每个源文件中有效。 静态全局变量限制范围。 这意味着它只在定义变量的源文件中有效,不能在同一源程序的其他源文件中使用。 静态全局变量的范围限定在一个源文件中,并且仅适用于该源文件中的函数,从而避免在其他源文件中出现错误。 以上分析表明,将局部变量改为静态变量后,改变了保存方法,即改变了生存期。 将全局变量更改为静态变量后,更改并限制了范围
的使用范围。 因此,static这个说明子所起的作用因地点而异。 应该注意。
四.寄存器变量
由于这些变量都存储在内存中,如果频繁地对一个变量进行读写,就必须反复访问内部存储器,需要很多访问时间。 因此,C语言提供了另一个变量,即寄存器变量。 这些变量存储在CPU的寄存器中,使用时不需要访问内存,直接从寄存器读写可以提高效率。 寄存器变量的说明符是register。 循环次数多的循环控制变量和循环内重复使用的变量均可定义为寄存器变量。
[例5.16 ]求出200 I=1imain
{
register i,s=0;
for(I=1; i=200; I )
s=s i;
printf(s=%d(n ),s );
}
本程序循环200次,I和s都被频繁使用,因此可以定义为寄存器变量。
关于寄存器变量,还将说明以下内容。
1 .只有局部自动变量和形式参数可以定义为寄存器变量。 因为寄存器变量是动态存储方式。 必须采用静态存储方法的量不能定义为寄存器变量。 2 .在涡轮c、MS C等微机上使用的c语言中,实际上是把寄存器变量作为自动变量处理的。 所以并不是速度会上升。 程序允许使用寄存器变量只是为了与标准c一致。 3 .即使是实际上可以使用寄存器变量机器,由于CPU内的寄存器的个数是有限的,所以要使用的寄存器变量的个数也是有限的。
内部和外部函数
定义函数后,可以从其他函数调用它。 但是,如果一个源程序由多个源文件构成,在一个源文件中定义的函数是否被其他源文件中的函数调用? 因此,c语言将函数分为两类。
一.内部函数
如果在某个源文件中定义的函数只从该文件内的函数调用,而不是从同一源程序其他文件内的函数调用,则该函数为
数称为内部函数。定义内部函数的一般形式是: static 类型说明符 函数名(形参表) 例如:
static int f(int a,int b) 内部函数也称为静态函数。但此处静态static 的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。 因此在不同的源文件中定义同名的静态函数不会引起混淆。
二、外部函数
外部函数在整个源程序中都有效,其定义的一般形式为: extern 类型说明符 函数名(形参表) 例如:
extern int f(int a,int b)如在函数定义中没有说明extern或static则隐含为extern。在一个源文件的函数中调用其它源文件中定义的外部函数时,应 用extern说明被调函数为外部函数。例如:
F1.C (源文件一)
main()
{
extern int f1(int i); /*外部函数说明,表示f1函
数在其它源文件中*/
……
}
F2.C (源文件二)
extern int f1(int i); /*外部函数定义*/