第3章 模块化程序设计_第1页
第3章 模块化程序设计_第2页
第3章 模块化程序设计_第3页
第3章 模块化程序设计_第4页
第3章 模块化程序设计_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

16十月2023济南大学·信息学院第三章模块化程序设计3.1模块化程序设计思想3.2函数定义3.3函数调用3.4函数的原型与声明3.5函数的嵌套与递归3.6库函数3.7变量的作用域与存储类型3.8指针与函数16十月2023济南大学·信息学院:在家里请客吃火锅:请甲乙丙丁四人。给甲打电话:顺路买点菜来,就差蔬菜了。给乙打电话:顺路去买点羊肉,就差肉了。给丙打电话:顺路买点冻豆腐各种丸啥的,就差这个了!给丁打电话:顺路在楼下超市拎几瓶啤酒和蘸料上来,就差酒了。放下电话去厨房把电饭锅里倒上水,然后倒上火锅底料,等着就行了……16十月2023济南大学·信息学院另一个版本:买台组装电脑:请甲乙丙丁等人。给甲打电话:顺路买块“华硕”的主板来,就差主板了。给乙打电话:顺路去买个Intel的CPU,就差CPU了。给丙打电话:顺路买个硬盘来,就差硬盘了!给丁打电话:顺路买个显示器来,就差显示器了。……放下电话准备好螺丝刀,然后倒一杯茶,等着就行了……16十月2023济南大学·信息学院#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);return(0);}一个完整的函数一个完整的函数函数首部函数体16十月2023济南大学·信息学院例3.1求表达式的值。其中,K、M、N是正整数(1≤K、M、N≤12)。分析:分别计算K、M、N的阶乘,再相除。doulbefk,fm,fn;特点:重复执行阶乘运算,只是每次阶乘的数不同。问题:能否减少代码重复的次数?fk=1;for(i=1;i<=K;i++)fk=fk*i;fm=1;for(i=1;i<=M;i++)fm=fm*i;fn=1;for(i=1;i<=N;i++)fn=fn*i;x=fk/(fm+fn);printf("%lf\n",x);16十月2023济南大学·信息学院定义函数:intfact(intn);

//计算参数n的阶乘

fact(K):计算K!

fact(M):计算M!

fact(N):计算N!原表达式即可写成:

fact(K)/(fact(M)+fact(N))doublefact(intn){doubler=1;inti;for(i=1;i<=n;i++)r=r*i;

return(r);}16十月2023济南大学·信息学院#include<stdio.h>doublefact(intf){

doubler=1;inti;for(i=1;i<=f;i++)r=r*i;returnr;}intmain(){intk,m,n;doublex;scanf("%d%d%d",&k,&m,&n);x=fact(k)/(fact(m)+fact(n));printf("K!/(M!+N!)=%lf\n",x);return(0);}EG301.C一个完整的函数一个完整的函数函数首部函数体16十月2023济南大学·信息学院3.1模块化程序设计思想模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。把整个程序划分为若干个功能单一、相对独立、较易求解的程序模块,然后分别予以实现,最后再把所有的程序模块整合起来,这种在程序设计中逐步分解、分而治之的策略,被称为模块化程序设计方法。

C语言中用函数实现模块的功能。16十月2023济南大学·信息学院3.2函数定义在C语言中,函数分为以下两种:(1)

库函数是由系统提供的,用户不用定义,只需用#include包含其头文件,即可直接使用。如:printf()、scanf()、sqrt()等。(2)自定义函数:这种函数是根据具体需求按自己的意愿编写的,以完成相应的功能。16十月2023济南大学·信息学院1、函数定义的形式:函数类型函数名(形式参数表列){

变量声明部分语句部分}2、说明:①、函数名:用户给函数起的名字,必须符合标识符命名规则,“见名知义”;注意不能与系统的关键字、库函数等同名,如int、if、printf、sin、sqrt等②、函数类型:即函数值(返回值)的类型若返回值为int

或char

类型,可省略不写;若函数无返回值,函数定义时应写上voidintmax(intx,inty){

……}intmain(){

……return0;}16十月2023济南大学·信息学院③、形式参数表列:说明参数的个数和类型

作用:表示从主调函数中接收数据的个数及每个数据的类型书写格式

:每一个参数都要分别写上数据类型和参数名;参数之间以逗号分隔,无参数时一般写上void

或什么也不写doublemax(doublea,doubleb,doublec){……}/*从主调函数中接收3个数据,均为double类型返回结果为double型数据*/形参不能写成:doublea,b,c×④、变量说明:定义函数中用到的除形参以外的其它变量;即形参不能再次定义(或者说不能定义与形参同名的变量)⑤、语句部分:完成函数功能的语句序列。16十月2023济南大学·信息学院3、例:①、编写一个函数,打印一行信息“Howdoyoudo!”printf("Howdoyoudo!\n");____print(____){}void

intmain(){return0;}print();#include<stdio.h>原则1:数据已知或是常量则不需作为参数传递;值事先不确定则需要参数传递!原则2:不要求计算结果或没有计算出一个数值的函数则不需定义返回值。EG302.C注意:函数名不能叫printf,不能与系统库函数同名。16十月2023济南大学·信息学院②、求整数x的n次幂(n>0,且为整数)______

power(__________){}intx,intndoublefor(i=1;i<=n;i++)p=p*x;inti;doublep=1;return(p);intmain(){return0;}scanf("%d%d",&x,&n);s=power(x,n);printf("%.0lf\n",s);intx,n;doubles;#include<stdio.h>EG303.C主函数应包含哪些内容:intmain(){return0;}变量定义输入数据处理--函数调用输出结果16十月2023济南大学·信息学院③、将指定的字符打印n次____print(_____________){}charch,intnvoidfor(i=1;i<=n;i++)putchar(ch);inti;printf("\n");intmain(){return0;}scanf("%c",&ch);scanf("%d",&n);print(ch,n);charch;intn;#include<stdio.h>在自定义函数中:一般不输入数据,要处理的数据来自于参数,这样使得可对不同的参数进行相同的处理;也不输出计算结果,计算结果通过return返回。EG304.C16十月2023济南大学·信息学院定义函数时需要解决的问题:有没有参数:从主调函数中传递数据;参数的个数:从主调函数中接收几个数据参数的类型:int、float、double、char或指针是否有返回值:向主调函数返回计算结果返回值的类型:编写函数的原则:数据的输入输出均在主调函数中进行,通过参数将要计算的数据传入被调函数,由被调函数进行计算,并通过返回值返回计算结果。16十月2023济南大学·信息学院例、请编写函数fun,它的功能是:根据整形形参m,计算如下公式的值。当m中的值为5,则应输出1.463611。注意:部分源程序已给出。请勿改动main函数和其它已经给出的语句,仅在main函数之前的空白处编写fun函数。#include<stdio.h>intmain(){intn=5;printf("Theresultis%lf\n",fun(n));return0;}16十月2023济南大学·信息学院例、下列程序中,函数fun的功能是:计算正整数num的各位上的数字之积。注意:部分源程序已给出。请勿改动main函数和其它已经给出的语句,仅在main函数之前的空白处编写fun函数。#include<stdio.h>intmain(){intn;printf("Pleaseinputanumber:");scanf("%d",&n);printf("%d\n",fun(n));return0;}16十月2023济南大学·信息学院3.3函数调用3.3.1函数调用的形式1、形式:函数名(实参表列);2、说明①、实参表列由0到多个实参名组成,实参之间用逗号分隔②、实参与形参的个数应相等,类型应一致,顺序要一一对应③、调用无参函数的格式为:函数名();#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);return0;}16十月2023济南大学·信息学院3、函数调用的方式①、函数调用语句:–无返回值函数,或不需要返回值的函数调用形式

由函数调用加上分号构成,在主调函数中可作为一个独立的语句;此时不要求函数带回返回值printf("ThisisaCprogram!\n");②、函数表达式:

函数调用作为一个运算对象出现在表达式中,此时要求函数带回一个确定的值以参加表达式的运算c=max(a,b);y=2*pow(x,2.5);③、函数参数:

函数调用作为另一个函数的实参,其值作为一个实际参数传给被调函数的形参;此时也要求函数带回一个确定值m=max(a,max(b,c));printf("%d\n",max(a,b));16十月2023济南大学·信息学院3.3.2函数间的参数传递定义函数的目的是为了实现某个特定功能。当函数被调用时,一般需要给它传递一些数据,供它直接处理或辅助它实现具体的功能。把需要参数的函数称为“有参函数”,不需要参数的函数称为“无参函数”。形式参数:定义函数时函数名后面括号内的变量,简称形参实际参数:调用函数时函数名后面括号内的变量,简称实参#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d.\n",c);return0;}形参实参16十月2023济南大学·信息学院例3.2输入两个整数,计算其平均值。要求用函数实现平均值的计算。有没有参数:有参数的个数:2参数的类型:均为int是否有返回值:有返回值的类型:float或doubledoublefun(intx,inty){doubleresult;result=(x+y)/2.0;return(result);}intmain(){inta,b;

doubleave;scanf("%d%d",&a,&b);

ave=fun(a,b);printf("ave=%.1f\n",ave);return0;}EG305.C16十月2023济南大学·信息学院说明:①、程序在编译时不为形参分配存储空间,只有当函数被调用时,形参才被分配存储空间,并在调用结束后释放所占的存储空间。②、形参只能是变量;而实参可以是常量、变量、表达式或具有返回值的函数调用,但要求它们有确定的值。调用时将实参的值赋给形参。m=max(3,a+b);/*x=3;y=a+b;*/m=max(a,max(b,c));/*x=a;y=max(b,c);*/③、实参与形参的个数应相等,类型应一致或赋值兼容。④、C规定,实参对形参的数据传递是“值传递”,即单向传递。只能由实参传给形参,而不能由形参传回来给实参。在内存中,实参与形参占有不同的内存单元。16十月2023济南大学·信息学院#include<stdio.h>voidsum(intx,inty,intz){x=10;y=20;z=x+y;printf("x=%d,y=%d,z=%d\n",x,y,z);}intmain(){inta=1,b=2,c=0;sum(a,b,c);printf("a=%d,b=%d,c=%d\n",a,b,c);return0;}x=10,y=20,z=30a=1,b=2,c=0EG306.C16十月2023济南大学·信息学院3.3.3函数的返回值intmax(intx,inty){intz;z=x>y?x:y;

return(z);}1、函数的返回值是通过return语句获得的。return语句的作用是终止当前函数的执行并将一个确定值带回主调函数中return语句的一般形式是:return(表达式);或:return

表达式;2、函数返回值的类型:在定义函数时指定intmax(intx,inty)doublepower(intx,inty)C语言规定,凡不指定类型的函数,自动按整型(int)处理。max(intx,inty)intmax(intx,inty)16十月2023济南大学·信息学院

函数值的类型与return语句中表达式的类型应一致;若不一致,则以函数类型为准(自动转换)。intmax(doublex,doubley){return(x>y?x:y);}3、一个函数可以有多个return语句,但每个return后的表达式类型要相同;当执行到其中任何一个return语句时会立即返回主调函数4、对于有返回值的函数,若return语句后面没有表达式,或没有return语句,此时带回一个不确定的返回值。return;5、为了明确表示“不带回值”,可以用void定义“无类型”(或称“空类型”,即无返回值)。voidf(){…}16十月2023济南大学·信息学院例1:定义一个函数,判断整数m是否是素数。是素数返回整数1,不是返回0。isPrime(){

}intmintk=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i<=k)elsereturn0;return1;inti,k;intisPrime(intm){inti,k;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)

return0;

return1;}EG307.C16十月2023济南大学·信息学院例2:定义一个函数,判断某一年是否闰年。闰年的条件:能被4整除,但不能被100整除;或能被400整除。year%4==0&&year%100!=0||year%400==0leap(){}intyearintif(year%4==0&&year%100!=0||year%400==0)return1;elsereturn0;intleap(intyear){return(year%4==0&&year%100!=0||year%400==0);}EG308.C16十月2023济南大学·信息学院说明:①、被调用的函数必须已经存在;②、使用库函数时,应在文件开头用#include命令将有关头文件包含进来;#include<stdio.h>#include<math.h>#include<string.h>③、若用户自己定义的函数在主调函数之后,则应在主调函数之前对被调用的函数作声明定义:对函数功能的确定;包括指定函数名、函数类型、形参及类型、函数体等。--一个完整的函数声明:将函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统。--由函数首部加分号构成16十月2023济南大学·信息学院3.4函数的原型与声明在函数调用之前应当对所调用的函数进行声明,指出该函数的返回值的类型以及形参的个数和类型,编译器据此对函数调用进行语法检查,保证函数使用的正确性。1、函数声明的格式:函数类型函数名(

形参表);doublefun(doublea,intb,floatc){……}可以声明为以下几种形式:

doublefun(doublea,intb,floatc);

doublefun(double,int,float);

doublefun(doublex,inty,floatz);16十月2023济南大学·信息学院2、说明:①、函数声明的位置:一种是在主调函数中对被调函数进行函数声明;另一种是在所有函数的外部进行函数声明(推荐)。②、如果被调函数出现在主调函数之前,可以不必进行声明。--(推荐)#include<stdio.h>intmax(intx,inty);intmain(){……}intmax(intx,inty){……}#include<stdio.h>intmax(intx,inty){……}intmain(){……}16十月2023济南大学·信息学院3.5函数的嵌套与递归3.5.1函数的嵌套调用例:计算2-n之间所有素数的和。intmain(){

定义n,s

输入n(n是整数)

求和---s=Sum(n)

输出sreturn0;}intSum(intn){for(i=2,s=0;i<=n;i++)if(i是素数)s+=i;returns;}intisPrime(intm){inti,k;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)return0;return1;}16十月2023济南大学·信息学院组织成一个完整的C程序:#include<stdio.h>#include<math.h>intisPrime(intm){inti,k;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)return0;return1;}intSum(intn){inti,s=0;for(i=2;i<=n;i++)if(isPrime(i)==1)s+=i;returns;}intmain(){

定义n,s

输入n(n是整数)

求和---s=Sum(n)

输出sreturn0;}intmain(){intn,s;printf("Inputn(n>1):");scanf("%d",&n);

s=Sum(n);printf("s=%d\n",s);return0;}EG309.C16十月2023济南大学·信息学院C语言的函数定义都是互相平行的、独立的,即不允许嵌套定义函数(即在一个函数内部定义另一个函数);但是,可以嵌套调用函数,即程序在调用一个函数的过程中,该被调函数又可以调用其它函数。intmain(){:

Sum();:}intSum(){:

isPrime();:}main函数Sum函数isPrime函数调用调用嵌套调用16十月2023济南大学·信息学院函数在被调用的过程中,又直接或间接地调用自身,则称函数的递归调用。这种函数也被称为递归函数。C语言允许函数的递归调用。3.5.2函数的递归调用例3.5用递归方法求整数n的阶乘n!。分析:一般来说,n!描述成为:

n!=1*2*3*…*(n-1)*n但是,变换一下,就可以将其描述成为:

n!=n*(n-1)*…3*2*1=n*(n-1)!16十月2023济南大学·信息学院#include<stdio.h>doublefact(intn){if(n==0||n==1)return1;elsereturnn*fact(n-1);}intmain(){intn;doubleresult;printf("Inputn:");scanf("%d",&n);result=fact(n);printf("%d!=%.0f\n",n,result);return0;}fact(5)5*fact(4)4*fact(3)3*fact(2)2*fact(1)12*13*24*65*24120EG310.C16十月2023济南大学·信息学院3.6库函数库函数:即系统已经定义好、具有特定功能的函数。这些函数可以直接使用,不必重新定义,但使用时需要用#include命令把相应的头文件包含进来。输入输出函数(头文件:stdio.h):

printf()scanf()getchar()putchar()数学函数(头文件:math.h):

sqrt()pow()fabs()log10()log()字符串函数(头文件:string.h):

strcpy()strcat()strcmp()strlen()各函数的功能见附录,使用时注意参数个数及类型、函数的返回值。16十月2023济南大学·信息学院3.7变量的作用域与存储类型3.7.1变量的作用域作用域:指变量能够起作用的程序范围局部变量全局变量从作用域角度16十月2023济南大学·信息学院作用域与生存期一、作用域:指变量能够起作用的程序范围如果一个变量在某源程序文件或某函数范围内有效,则称该文件或函数为该变量的作用域。局部变量全局变量从作用域角度二、生存期:指变量在内存中存在的时间范围静态变量动态变量从生存期角度变量在整个程序的运行时间都存在变量只在某个函数的执行过程中才存在16十月2023济南大学·信息学院1局部变量#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);return0;}1、局部变量:

指在一个函数或复合语句内部(位于一对花括号之间)定义的变量;只在本函数或复合语句的范围内有效x、y、z的有效范围a、b、c的有效范围16十月2023济南大学·信息学院2、说明:①、main函数中定义的变量是局部变量,只能在main函数中使用②、不同函数中可以使用相同名字的变量,它们占用不同的内存单元,互相独立③、形式参数也是局部变量④、复合语句中定义的变量,其作用域只是本复合语句intmain(){

inta,b;……{

intc;c=a+b;……}……}c在此范围内有效a、b在此范围内有效16十月2023济南大学·信息学院#include<stdio.h>intmain(){inti,a=0;for(i=1;i<=2;i++){

inta=1;a++;printf("i=%d,a=%d\n",i,a);}printf("i=%d,a=%d\n",i,a);return0;}i=1,a=2i=2,a=2i=3,a=0EG311.C16十月2023济南大学·信息学院2全局变量1、定义:全局变量:指在所有函数外部定义的变量,又称外部变量可以为本文件中其它函数所共用,其有效范围为:从定义变量的位置开始到本源文件结束2、例:16十月2023济南大学·信息学院#include<stdio.h>intp=1,q=5;floatf1(inta){floatr;…}ints;intf2(intb,intc){intsum;…}floatm,n;intmain(){floatx,y;…}全局变量p和q的有效范围全局变量s的有效范围全局变量m和n的有效范围16十月2023济南大学·信息学院3、说明:①、全局变量增加了函数间的数据联系;由于在同一文件中的所有函数都能使用全局变量,所以可以利用全局变量从函数中得到一个以上的返回值全局变量名的第一个字母常用大写字母表示②、建议不要过多的使用全局变量全局变量在程序的执行过程中一直占用存储单元它使函数的通用性降低会降低程序的清晰性#include<stdio.h>intk;voidshow(){for(k=1;k<=10;k++)putchar('*');putchar('\n');}intmain(){for(k=1;k<=4;k++)show();return0;}EG312.C16十月2023济南大学·信息学院③、全局变量在定义时如果没有初始化,它们则会被系统自动初始化为零,而局部变量在定义时不会自动初始化。④、若全局变量与局部变量同名,则在局部变量的作用范围内,全局变量不起作用inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;return(c);}intmain(){

inta=8;printf("%d",max(a,b));return0;}形参a、b的作用域全局变量a、b不起作用局部变量a的作用域全局变量b的作用域全局变量a不起作用EG313.C16十月2023济南大学·信息学院3.7.2变量的存储类型

变量的存储类型是指存储变量值的内存类型。它决定变量何时创建、何时销毁以及它的值将保存多久。变量的存储类型可分为“静态存储”和“动态存储”两种。

静态存储变量通常是在变量定义时就分配存储单元并一直保持不变,直到整个程序结束。全局变量即属于此类存储方式。

动态存储变量是在程序执行过程中,使用到它时才分配存储单元,使用完毕立即释放。如形参,函数被调用时才分配内存单元,函数调用完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。16十月2023济南大学·信息学院比较下列两个程序的输出结果:#include<stdio.h>voidfun(intx){inta=0;a+=2;printf("x=%d,a=%d\n",x,a);}intmain(){inti;for(i=1;i<=3;i++)fun(i);return0;}#include<stdio.h>voidfun(intx){staticinta=0;a+=2;printf("x=%d,a=%d\n",x,a);}intmain(){inti;for(i=1;i<=3;i++)fun(i);return0;}x=1,a=2x=2,a=2x=3,a=2x=1,a=2x=2,a=4x=3,a=6EG314.C16十月2023济南大学·信息学院局部变量的存储类别:1、函数中的局部变量,如不专门声明或用auto声明,称为自动变量或动态变量。通常auto被省略。它在函数被调用时分配内存单元,调用完毕即释放所占用的内存单元,若再次被调用则重新分配内存单元。intb,c=3;floatf;autointb,c=3;autofloatf;自动变量包括:函数内定义的变量、形参和复合语句内定义的变量。2、局部静态变量(static)函数被调用时分配内存单元,函数调用结束后不释放占用内存单元,直到程序运行结束才释放存储单元,即在整个程序的运行中不释放存储单元。staticinti,area;staticinta[10];16十月2023济南大学·信息学院说明:若对变量赋初值,对于自动变量,每次调用都要重新分配内存单元并赋初值;而对于静态变量,只执行一次,再次调用函数时不再赋初值而保留上次函数调用结束时的值;#include<stdio.h>voidfun(intx){staticinta=0;a+=2;printf("x=%d,a=%d\n",x,a);}intmain(){inti;for(i=1;i<=3;i++)fun(i);return0;}x=1,a=2x=2,a=4x=3,a=6EG314.C适用范围:①、需要保留函数上一次调用结束时的值;②、对于数组进行初始化,通常定义为静态存储类别。说明:对于动态变量,定义时若不赋值,值不确定对于静态变量,定义时若不赋值,系统自动赋值为016十月2023济南大学·信息学院3、寄存器变量(register)一般情况下,变量都是存放在内存中的。为了减少从内存中存取变量值的时间,C语言允许将局部变量的值放在寄存器中,用关键字register声明。intfac(intn){

registerinti,f;for(i=1;i<=n;i++)f=f*i;returnf;}说明:①、只有局部变量和形参可以定义为寄存器变量;②、不能定义太多的寄存器变量,因为寄存器数量有限,太多无效(将自动按自动变量处理)。16十月2023济南大学·信息学院全局变量的存储类别:全局变量是在函数外部定义的,属于静态变量,在程序的整个运行过程中占用存储单元,存在于程序的整个运行期间。全局变量有两种存储类别:static和extern。如果想在定义之前的函数中引用全局变量,则在函数中用关键字“extern”作“外部变量声明”,在函数内部,从声明之处起,可以使用它们。……intmain(){

externinta,b;//声明,此处不能再赋值

printf("%d",max(a,b));return0;}inta=13,b=-8;//定义,此处可以赋值,也可以不赋值若不赋值,系统自动赋值为016十月2023济南大学·信息学院2、如果一个C程序由多个源程序文件组成,那么一个某文件中的函数能否引用另一个文件中的全局变量,有两种情况:①、在一个文件中要引用另一文件中定义的全局变量,要在引用它的文件中用extern作声明file1.cintMax;intmain(){……}file2.cexternintMax;intpower(){

Max=12;……}在文件file1.c中定义的变量Max,在文件file2.c中引用,引用前加上extern进行声明。16十月2023济南大学·信息学院②、如果要全局变量仅限于被本文件中的函数引用,其它文件不能使用。定义全局变量时用static进行声明file1.cstaticintMax;intmain(){……}file2.cexternintMax;intpower(){Max=12;……}×加上static,限制了Max的作用域,在file2.c中引用失败;但不管是否加上static,Max都按静态存储方式存放16十月2023济南大学·信息学院存储类别小结1、数据的两种属性:数据类型存储类别autofloata;staticintb;registercharc;externintd;(声明变量是已定义的变量)2、从作用域分:局部变量全局变量自动变量静态局部变量寄存器变量形参静态全局变量非静态全局变量16十月2023济南大学·信息学院3、从生存期分:动态存储静态存储自动变量寄存器变量形参静态局部变量静态全局变量非静态全局变量4、从存放位置分:内存的静态存储区:内存的动态存储区:CPU中的寄存器:静态局部变量静态全局变量外部变量自动变量形参寄存器变量16十月2023济南大学·信息学院3.7.3函数的存储类别一、内部函数:如果限制一个函数只能被本文件中其它函数所调用,称为内部函数(或静态函数)。定义时在函数类型前加static。staticintfac(intx){……}二、外部函数:定义时在函数类型前加关键字extern。externintfac(intx){……}C语言规定,如果在定义函数时省略extern,则隐含为外部函数。在需要调用此函数的文件中,要用extern声明所调用函数的原型。16十月2023济南大学·信息学院3.8指针与函数例:在主函数中输入两个整数a和b,编写函数交换a、b的值#include<stdio.h>voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}intmain(){inta,b;printf("Inputa,b:");scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);swap(a,b);printf("a=%d,b=%d\n",a,b);return0;}EG315.C16十月2023济南大学·信息学院用全局变量实现:#include<stdio.h>inta,b;voidswap(){inttemp;temp=a;a=b;b=temp;}intmain(){printf("Inputa,b:");scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);

swap(

);printf("a=%d,b=%d\n",a,b);return0;}问题的提出:从被调函数中如果要返回n个值到主调函数,除了使用全局变量外还有其他办法吗?(不提倡用全局变量)EG316.C16十月2023济南大学·信息学院3.8.1指针作为函数参数1、形参:只需要形参前加上一个*即可。如:voidswap(int*pa,int*pb)2、说明函数中可以通过形参引用实参的地址,从而可以改变该地址的值,即实参变量的值。intmain(

){inta;fun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论