预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共15页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

本章重点 8.1变量的作用域 8.2变量的存储类别 8.3函数的存储分类8.1变量的作用域 变量定义:指给变量分配确定的存储单元。 变量说明:说明变量的性质,而不分配存储单元。 变量作用域:变量在程序中可以被使用的有效范围。 8.1.1局部变量 定义:指在一个函数内部或复合语句内部定义的变量。 intfunc1(inta)/*本函数中变量a,b,c有效*/ {intb,c; ……} 注意:形式参数与实际参数范围不同,形式参数变量是属于被调函数的局部变量,实际参数变量是属于主调函数的局部变量。 例8-1(P127)分析以下程序的输出结果。 #include<stdio.h> intfunc(); voidmain(){inta=1; func(); printf("a=%d\n",a);} intfunc(){ inta=2; printf("a=%d\n",a);} 注:被调函数执行完后,变量释放存储空间。8.1.2全局变量 定义(外部变量):指在函数外部任意位置定义的变量。 说明: 1.全局变量的作用域从定义变量的位置开始到本源文 件结束。 2.若全局变量的作用域内的函数或复合语句中定义了 同名局部变量,则在局部变量的作用域内,同名全局 变量被“屏蔽”,暂时不起作用。 3.在同一文件中的所有函数都能引用全部变量的值, 如果在一个函数内改变全局变量值,就会影响到其他 函数,因此一般不要使用全局变量。例8-2(P128)分析以下程序的输出结果。 #include<stdio.h> inta=3,b=5;//a和b为全局变量,作用范围到本程序文件结束 intmax(inta,intb){//形参a和b为局部变量 intc; c=a>b?a:b; returnc;} voidmain(){ inta=8;//a为局部变量 printf("%d\n",max(a,b));}8.2变量的存储类别 变量的两种属性:数据类型和数据的存储类别。 存储类别:指数据的存储位置与生存期,而变量在 内存中占据存储空间的时间称为变量的生存期。 变量存储方式可分为静态存储方式和动态存储方式。 静态存储方式:程序运行期间分配固定的存储空间。 动态存储方式:程序运行期间根据需要动态分配存 储空间。 有4个说明符与这两种存储方式相关:auto(自动的)、 static(静态的)、register(寄存器的)和extern(外部的)。8.2.1auto变量(自动变量) 当在函数内部或复合语句内定义变量时,如果没有 指定存储类或使用了auto说明符,系统默认为自动 类别,全局变量不能声明为自动类别。 例如:autointb,c=3;等价于intb,c=3; 8.2.2static变量(静态变量) static不能省略,分为静态局部变量和静态全局变量。 说明:1.形参不能定义为静态变量。2.变量的初值: 若定义时未赋初值,编译时系统自动赋初值为0。 3.编译时分配内存的静态存储区,程序运行期间静态 变量在内存的静态存储区中占据着永久性的存储单元。 例8-4(P130)静态变量的应用。 #include<stdio.h> intfunc(inta){ intb=0; staticc=3; a=c++,b++;//注意逗号运算符和赋值运算符的优先级 return(a);} voidmain(){ inta=2,i,k; for(i=0;i<2;i++)k=func(a++); printf("%d\n",k);}8.2.3register变量(寄存器变量) 寄存器变量与auto变量的区别:寄存器型变量建议 编译程序将变量的值保留在CPU的寄存器中,而不 是像一般变量那样占内存单元。程序运行时,访问 存于寄存器内的值要比访问存于内存中的值快很多。 说明: 1.受寄存器长度限制,register变量只能是 char、int和指针类型的变量。 2.寄存器变量的值存在寄存器中而非内存中,因此 寄存器变量没有地址,不能对其进行求地址运算。 3.寄存器个数有限。 8.2.4extern变量(外部变量) 全局变量可以使用static和extern两种说明符。 extern说明符的主要作用是扩展全局变量的作用域。 1.在同一编译单位内用extern说明符来扩展全局变 量的作用域 如果全局变量不在文件开头定义,其作用范围只限 于定义处到文件结束。若定义点之前的函数想引用 该全局变量,则应该在引用之前用关键字extern对该 变量作全局变量声明,以便通知编译程序,该变量 是一个已经定义的全局变量,并分配了存储单元, 作用域扩展到从extern声明处起至函数末尾。例8-6(P132)用extern声明全局变量,扩展全局 变量在同一编译单位内的作用域。 #include<stdio.h>