C语言变量作用域与存储类.pptVIP

  • 2
  • 0
  • 约5.47千字
  • 约 32页
  • 2019-12-08 发布于广东
  • 举报
void prt(); int i; main() { for(i=0;i5;i++) prt(); } void prt() { for(i=0;i5;i++) printf(“%c”,’*’); printf(“\n”); } 示例 全局变量的副作用 运行结果:***** 12-4 函数的存储分类 所有函数都是外部的,因为不允许在函数内部定义另一个函数 第十二章 变量的作用域和存储类 第十二章 变量的作用域和存储类 在C语言中,变量必须先定义,后使用。但定义语句应该放在什么位置?在程序中,一个定义了的变量是否随处可用?这些问题牵涉到变量的作用域。经过赋值的变量是否在程序运行期间总能保存其值?这又牵涉到变量的生存期。本章将对这些问题进行详细的讨论。 12.1 变量的作用域和存储类别 12.1.1 变量的作用域 变量的作用域即变量在程序中的有效范围。即在程序的什么范围内变量可以被识别和使用。根据作用域的大小,变量可分为: 局部变量:在函数内部或复合语句内部定义的变量(函数的形参也属于局部变量)。 全局变量:在函数外部定义的变量。 #includestdio.h int a , b ; a = 2 ; b = 3 ; main ( ) { int s ; s = fun ( a , b ) ; printf ( “s=%d\n” , s ) ; } int fun ( int x , int y ) { int z ; z = x + y ; return z ; } 显然,变量的作用域与其定义语句在程序中出现的位置有直接关系。 12.1 变量的作用域和存储类别 12.1.2 变量的存储类别 变量的生存期通过存储类别来设置,存储类别规定了变量在内存中的存储方法。存储类别分为两类: 自动类:使用auto(自动)、register(寄存器)说明符。全局变量不能是自动类。 静态类:使用static(静态)说明符。局部变量和全局变量皆可为静态类。 变量的存储类别 动态存储 根据需要临时分配存储空间,离开即释放 静态存储 在程序运行期间分配固定的存储空间不释放 程序区 静态存储区 动态存储区 形参、自动变量(auto、register) 全局变量、静态(static)变量 存储类别说明符通常与类型名一起出现,它们可以放在类型名的左边,也可以放在类型名的右边。 例如: auto int a , b ; 也可写成: int auto a , b ; 12.2 局部变量的作用域和生存期 12.2.1 auto 变量 当在函数内部或复合语句内部定义变量时,如果没有指定存储类,或使用了auto说明符,系统就认为所定义的变量具有自动类别。 例如: int a ; 等价于: auto int a ; “自动”体现在: 进入语句块时自动申请内存,退出时自动释放内存 对它们分配和释放存储空间的工作由编译系统自动处理,故称其为自动变量 自动类局部变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止。 void fun ( int a ) /* 形参的缺省类别是auto */ { int i ; /*形参a和变量i作用域是整个fun函数*/ …… if ( i 0 ) { int n ; /*变量n的作用域仅限于if子句内*/ …… printf (“%d\n” , n ) ; } …… } auto变量示例 double fun1( double p1) { int p2, p3; ..... } char fun2( char p4) { char p5, p6; ...... } main() { float x, y; ...... } p1、p2、p3的有效区 p4、p5、p6的有效区 x、y的有效区 int a, b; a、b有效区 int f1( int a, int b ) { int m; m=a*b; return(m); } 例: 在函数内部 m为局部变量,形参a,b也是局部变量,只在函数f1()中有效。 随函数f1()的建立而建立,并随其消亡而消亡。 main() { int x=10; if (x==10)

文档评论(0)

1亿VIP精品文档

相关文档