C语言第七章 函数.pptVIP

  • 6
  • 0
  • 约1.62万字
  • 约 51页
  • 2020-02-07 发布于辽宁
  • 举报
说明: (1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在 程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动 态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结 束后即释放。 (2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行 时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次 函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的, 而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执 行一次赋值语句。 (3)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时 自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动 变量来说,如果不赋初值则它的值是一个不确定的值。这是由于每次 函数调用结束后存储单元已释放,下次调用时又重新另分配存储单 元,而所分配的单元中的值是不确定的。 (4)虽然静态局部变量在函数调用结束后仍然存在,但其它函数不能引用 它。 4.register变量 一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中,经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放,如图所示。 如果有一些变量使用频繁,则为存取变量的值要花不少时间。为提高执行效率,C语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄 存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做“寄存器变量”,用关键字register作声明。 例7.11 输出1到5的阶乘的值。(使用寄存器变量) #include stdio.h int fac(int n) { register int i,f=1; //定义寄存器变量 for(i=1;i=n;i++) f=f*i; return(f); } void main( ) { int i; for(i=1;i=5;i++) printf(%d!=%d\n,i,fac(i)); } 说明: (1)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不 能定义为寄存器变量 。在调用一个函数时占用一些寄存器以存放寄存器变量 的值,函数调用结束释放寄存器。此后,在调用另一个函数时又可以利用它 来存放该函数的寄存器变量。 (2)一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。 不同的系统允许使用的寄存器是不同的,而且对register变量的处理方法也是 不同的,有的系统对register变量当作自动变量处理,分配内存单元,并不真 正把它们存放在寄存器中,有的系统只允许将int、char和指针型变量定义为 寄存器变量。 当今的优化编译系统能够识别使用频繁的变量,从而自动地将这些变量 放在寄存器中,而不需要程序设计者指定。因此,实际上用register声明变量 是不必要的。 (3)局部静态变量不能定义为寄存器变量。 register static int a,b,c;  //错误 注意:对一个变量只能声明为一个存储类别。一个变量不能既是register类 别,又是static类别。 5.用extern声明外部变量 外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量的定义 处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所 引用。编译时将外部变量分配在静态存储区。 有时需要用extern来声明外部变量,以扩展外部变量的作用域。 (1)在一个文件内声明外部变量 【例7-12】编写一个用extern声明外部变量的程序。 #include stdio.h int max(int x,int y) //max(13,-8) {

文档评论(0)

1亿VIP精品文档

相关文档