c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《c语言程序设计(周经亚)第7章-利用函数实现模块化程序设计课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 周经亚 利用 函数 实现 模块化 程序设计 课件
- 资源描述:
-
1、C语言程序设计 C语言程序设计周经亚jy_计算机科学与技术学院C语言程序设计 作用域含义:变量作用域是指该变量可以被访问的代码段范围根据作用域划分变量:1、局部变量:在某个函数内部(包括main)定义,隶属于该函数;作用范围为定义点到所属函数结束;2、全局变量:在函数(包括main)外部定义,不属于任何函数;作用范围为定义点到本源文件的结束,为本文件中其他函数所共用;C语言程序设计Soochow University2第7章 用函数实现模块化程序设计-IIC语言程序设计 全局/局部变量的注意点1)函数的形参是局部变量;2)复合语句中可定义变量;例如:if(ab)int temp;temp=a;
2、a=b;b=temp;3)不同函数中可以使用同名的局部变量,不同代码段中使用的同名变量的含义不同;4)全局变量与局部变量同名时,局部变量优先级高于全局变量;例如:C语言程序设计Soochow University3C语言程序设计 例如:int p=1,q=5;float f1(int a)int b,c;char c1;char f2(int x,int y)int b,j;main()int p,c1;C语言程序设计Soochow University4main()里看到的是局部变量pC语言程序设计 全局变量的说明o 全局变量的优点:n全局变量的作用是增加了函数间数据联系的渠道n命名惯例:例
3、如:int g_num;o 全局变量的缺点:n全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元n它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。不符合:在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱的原则n使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值o 建议:在程序中尽量限制使用全局变量!C语言程序设计Soochow University5C语言程序设计 变量的存储类别o 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。o 从变量值存在的时间(即生存期)角度来分,可以
4、分为静态存储方式和动态存储方式。n 静态存储方式是指在程序运行期间分配固定的存储空间的方式。n 动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。C语言程序设计Soochow University6C语言程序设计 C程序的内存布局C程序一直由下列部分组成:1)正文段CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;2)初始化数据段(数据段)在程序中所有赋了初值的全局变量,存放在这里。3)非初始化数据段(bss段)在程序中没有初始化的全局变量;内核将此段初始化为0。4)栈增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(
5、返回地址;环境信息)。5)堆动态存储分配。|-|(后面会讲到的指针类型,它分配的内存空间就是在堆上)C语言程序设计Soochow University7|-|-|栈栈|-|/|-|堆堆|-|未初始化未初始化|-|初始化初始化|-|正文段正文段|-|C语言程序设计 C程序的内存布局/file.cint g_minV=0;/全局变量int max(int x,int y)g_minV=xy?x:y);int g_maxV;/全局变量void main()int x=6,y=9;maxV=max(x,y);printf(The max value:%d,g_maxV);printf(The min
6、value:%d,g_minV);C语言程序设计Soochow University8形参形参实参实参|-|-|栈栈|-|/|-|堆堆|-|未初始化未初始化|-|初始化初始化|-|正文段正文段|-|正文段正文段codecodeg_minV.g_maxV.堆堆x=6y=9.x=6y=9main()max()形参形参实参实参初始化初始化未初始化未初始化程序段程序段动动态态存存储储区区静态存静态存储区储区程序区程序区C语言程序设计 函数调用机制o 函数调用过程n建立被调函数的栈空间n保护调用函数的运行状态和返回地址o目的是保护好现场环境,以便函数调用完成后,能够返回到调用函数前程序运行的正确状态n传
7、递参数o传递的参数是放在栈空间中的,当函数调用完成,栈空间就会释放掉,所以默认情况下,传递的参数是按值传递的(也就是形参对实参进行值拷贝,形参和实参在内存中其实是两个完全不同的地址空间,只是二者的数值相同)n将控制权转交被调用函数o被调用函数按照程序员预先编好的指令(代码)开始执行C语言程序设计Soochow University9C语言程序设计 动态存储方式与静态存储方式o 存储类别n 数据在内存中存储的方法o 两大类:n 静态存储类和动态存储类。n 具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)n 根据变量的存储类别,可以知道
8、变量的作用域和生存期。C语言程序设计Soochow University10C语言程序设计 auto变量o 自动变量:n存储在动态存储区的变量n函数中的局部变量(包括函数形参),如不专门声明为static存储类别,都是动态地分配存储空间的。n自动变量用关键字auto作存储类别的声明。而且auto关键字可以省略.C语言程序设计Soochow University11例如:例如:int f(int a)/*定义定义f函数,函数,a为形参为形参*/auto int b,c3;/*定义定义b、c为自动变量为自动变量*/C语言程序设计 用static声明局部变量o 静态局部变量n 有时希望函数中的局部变
9、量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值,这时就应该指定该局部变量为“静态局部变量”。n 静态局部变量用关键字static进行声明n 例如:static int a=3;C语言程序设计Soochow University12C语言程序设计 静态变量f(int a)auto int b0;static int c3;bb1;cc1;return(abc);main()int a2,i;for(i0;i3;i)printf(d,f(a));C语言程序设计Soochow University13运行结果为:运行
10、结果为:789C语言程序设计 对静态局部变量的说明o(1)生存期n静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。n自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。o(2)初始化n静态局部变量是在编译时初始化的,即只初始化一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。n自动变量初始化不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。C语言程序设计Soochow University14C语言程序设计 对静态
11、局部变量的说明o(3)默认值:(在定义局部变量时不初始化)n静态局部变量在编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。n自动变量的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。o(4)作用域n虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说作用域属于定义变量的函数。(这是和全局变量的区别)n自动变量的作用域是属于定义变量的函数。C语言程序设计Soochow University15C语言程序设计 需用静态局部变量的几种情况o(1)需要保留函数上一次调用结束时的值。C语言程序
12、设计Soochow University16int fac(int n)static int f1;ff*n;return(f););main()()int i;for(i1;i5;i)printf(“d!d ”,i,fac(i)););printf(“n”);运行结果为:运行结果为:1!1 2!2 3!6 4!24 5!120C语言程序设计 需用静态局部变量的几种情况o(2)如果初始化后,变量只被引用而不改变其值,这时用静态局部变量比较方便,以免每次调用时重新赋值。o 静态局部变量的缺点n 用静态存储要多占内存(长期占用不释放,而不能像动态存储那样一个存储单元可供多个变量使用,节约内存),而
13、且降低了程序的可读性,当调用次数多时往往弄不清静态局部变量的当前值是什么。因此,如不必要,不要多用静态局部变量。C语言程序设计Soochow University17C语言程序设计 register变量o 一般情况下的变量存储及运算过程o 使用频繁的变量的特殊使用方法:寄存器变量n语言允许将局部变量的值放在CPU的寄存器中n存放在CPU寄存器中的变量叫做“寄存器变量”,用关键字register作声明。C语言程序设计Soochow University18C语言程序设计 例如int fac(int n)register int i,f1;*定义寄存器变量*for(i1;in;i)ff*i;ret
14、urn(f);main()int i;for(i1;i5;i)printf(“d!dn”,i,fac(i));C语言程序设计Soochow University19C语言程序设计 有关寄存器变量说明o(1)。在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束释放寄存器。此后,在调用另一个函数时又可以利用它来存放该函数的寄存器变量。o(2)一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。o(3)局部静态变量不能定义为寄存器变量。不能写成register static int a,b,c;不能把变量a、b、c既放在静态存储区中,又放在寄存器中,二者只能居其一。对一个
15、变量只能声明为一个存储类别。C语言程序设计Soochow University20C语言程序设计 用extern声明外部变量o 外部变量(即全局变量)的作用域的规定:它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。o 外部变量(即全局变量)的作用域的扩展:有时需要用extern来声明外部变量,以扩展外部变量的作用域C语言程序设计Soochow University21C语言程序设计 用extern声明外部变量o 1.在一个文件内声明外部变量n 如果外部变量不在文件的开头定义,其有效的作用范围只限于从定义处开
16、始处起到文件终了的区域。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。C语言程序设计Soochow University22C语言程序设计 例如/file.cint max(int x,int y)*定义max函数*return(xy?x y);main()extern A,B;/*外部变量声明*/printf(d,max(A,B);int A13,B8;/*定义外部变量*/C语言程序设计Soochow University23F用用extern
17、声明外部变量时,类型名可以写也可以省写。声明外部变量时,类型名可以写也可以省写。例如上例中的例如上例中的“extern int A;”也可以写成:也可以写成:“extern A;”。C语言程序设计 用extern声明外部变量o 2.在多文件的程序中声明外部变量n 多文件的程序结构中一个文件要使用另一个文件中定义的外部变量o 如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序的连接时会出现“重复定义”的错误。o 多文件的程序结构中外部变量引用的正确的做法:在任一个文件中定义外部变量Num,而在其他文件中用extern
展开阅读全文