文档介绍:计算机技术基础
——C程序设计
信息科学与工程学院
02 十二月 2017
第八章函数
C程序设计第十讲
C程序设计第十讲
自动变量的作用域仅限于定义该变量的个体内。在函数中定义的自动变量,只在该函数内有效。
自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。
函数调用结束,释放存储单元,结束生存期。
因此函数调用结束之后,自动变量的值不能保留。
由于自动变量的作用域和生存期都局限于定义它的个体内( 函数或复合语句内), 不同的个体中允许使用同名的变量而不会混淆。
自动变量具有以下特点:
C程序设计第十讲
register变量
存放在CPU寄存器中,存取速度快
寄存器变量只能动态分配存储空间(寄存器)
只有自动变量和形参可以作为寄存器变量
举例
int foo(int x)
{
register int i; /* 定义寄存器变量i */
for(i=0; i<10000; i++)... /* i用于循环变量*/
}
C程序设计第十讲
外部变量的类型说明符为extern。
外部变量和全局变量是对同一类变量两种不同角度的提法。
全局变量是从它的作用域提出的,表示了它的作用范围。
外部变量从它的存储方式提出的,表示了它的生存期。
当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其它的源文件中也有效。
外部变量
C程序设计第十讲
静态变量的类型说明符是static。
静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。
例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。
自动变量属于动态存储方式,但也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
由此看来,变量可由static进行再说明,并改变其原有的存储方式。
静态变量
C程序设计第十讲
在局部变量说明前加上static说明符就构成静态局部变量。
1. 静态局部变量
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
静态局部变量属于静态存储方式,它具有以下特点:
(1) 静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。
静态局部变量始终存在着,它的生存期为整个源程序。
C程序设计第十讲
(2) 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(3) 基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
C程序设计第十讲
int f(int a)
{
int b=0;
static int c=3;
b++; c++;
return a+b+c;
}
void main()
{
int x=2, i;
for(i=0;i<3;i++)
printf("%d\n",f(x));
}
i
0
x
2
a
2
b
0
c
3
f(x)
-
1
2
1
4
5
6
7
8
9
C程序设计第十讲
全局变量的说明之前再冠以static就构成了静态全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。
这两者的区别:
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。