资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,本资料仅供参考,不能作为科学依据。谢谢。本资料仅供参考,不能作为科学依据。谢谢您,带参数函数,第十章,第1页,1,回顾 2-1,函数,是程序中一个相对独立单元或模块,使用函数带来好处:程序更清楚、易维护、分模块方便设计与开发、提升代码重用性,语言提供了极为丰富内置函数,要使用这些内置函数,需要在程序前包含对应头文件,自定义函数是用户在程序中依据需要而编写函数,第2页,2,回顾 2-2,函数结构包含,:返回值类型、函数名、参数列表、函数体,函数原型说明,方便向编译器指出该函数使用什么样格式和语法,函数调用时程序控制流将转向被调函数,被调函数执行结束时,控制流返回主调函数,return,语句,用于向调用函数返回值,第3页,3,目标,了解变量作用域,了解变量存放类型,了解两种参数传递方式:传值、引用,熟悉带参函数调用,熟练使用数组作为函数参数,第4页,4,变量作用域 4-1,作用域是一些事物起作用或有效区域。,限于陆地,限于海洋,限于空中,第5页,5,程序中变量也有不一样使用范围,称为变量作用域。变量作用域决定变量可访问性,变量作用域 4-2,void displayDiscount(),float discount_amt;,.,.,.,局部变量:不能在函数外使用,float discount_amt;,void main(),.,.,void displayDiscount(),.,.,全局变量:能够在整个程序中使用,第6页,6,变量作用域 4-3,#include,void addNumbers(),int num1,num2,sum;,printf(n 请输入两个数:);,scanf(%d%d,sum=num1+num2;,printf(子函数中 sum 值是%d n,sum);,void main(),int sum=0;,addNumbers();,printf(n 主函数中 sum 值是%d n,sum);,内存,sum,num2,0,45,num1,请输入两个数:56 45,子函数中sum值是101,主函数中sum值是 0,56,sum,101,第7页,7,变量作用域 4-4,#include,int sum=0;,void addNumbers(),int num1,num2;,printf(n 请输入两个数:);,scanf(%d%d,sum=num1+num2;,printf(子函数中 sum 值是%d n,sum);,void main(),addNumbers();,printf(n 主函数中 sum 值是%d n,sum);,内存,sum,num2,0,45,num1,请输入两个数:56 45,子函数中sum值是101,主函数中sum值是101,56,101,第8页,8,局部变量小结,局部变量是在函数内作定义说明变量,其作用域仅限于函数内,离开该函数后再使用这种变量是非法。,主函数中定义变量也只能在主函数中使用,不能在其它函数中使用。同时主函数中也不能使用其它函数中定义局部变量。,形参变量是属于被调函数局部变量,实参变量是属于主调函数局部变量。,允许在不一样函数中使用相同变量名,它们代表不一样对象,分配不一样内存单元,互不干扰。,第9页,9,全局变量小结,全局变量是在函数外部定义变量,它不属于哪一个函数,而是属于一个源程序文件。其作用域是整个源程序。,不是全部全局变量都能够直接使用,只有定义在该函数之前全局变量,才能在该函数中使用。,假如同一个程序多个函数都操纵同一个变量,全局变量会比较有用。,外部变量可加强函数模块之间数据联络,不过又使函数要依赖这些变量,使得函数独立性降低。从模块化程序设计观点来看这是不利,所以,在无须要时尽可能不要使用全局变量,。,在同一个源文件中,允许全局变量和局部变量同名。在同名局部变量作用域中,全局变量不起作用。,第10页,10,存放类型 2-1,变量存放方式可分为,“静态存放”,和,“动态存放”,两种,静态存放变量是一直存在,而动态存放变量则时而存在时而消失,这种因为变量存放方式不一样而产生特征称为变量,生存期,生存期表示了变量存在时间,第11页,11,静态局部变量,静态局部变量生存期为整个源程序,静态局部变量作用域与自动变量相同,即只能在定义该变量函数内使用该变量,对基本类型静态局部变量若在说明时未赋以初值,则系统自动赋予0值,函数被调用时,其中静态局部变量值将保留前次被调用结果,第12页,12,静态局部变量示例,void format(),static int m=0;,m+;,if(m%10=0),putchar(n);,else,putchar();,void main(),int i;,for(i=0;i50;i+),printf(%d,i);,format();,内存,i,0,m,0,1,1,循环执行,50,次,49,49,0 1,0 1 2 3 4 5 6 7 8 9,10 11 12 13 14 15 16 17 18 19,20 21 22 23 24 25 26 27 28 29,30 31 32 33 34 35 36 37 38 39,40 41 42 43 44 45 46 47 48 49,2,第13页,13,函数形参和实参,void main(),.,.,display(10,20.5);,display(int num,float fraction),.,.,实际参数,函数调用,形式参数,第14页,14,void main(),int a=0;/,初始化,a,值为,0,func,(a);,/,调用函数,func,printf(%d,a);/,输出,a,结果,/,定义函数,func,void func(int a),a=10;/,让参数,a,等于,10,传值调用,0,传值调用,将会输出什么,第15页,15,#include,void increment(int,int);,void main(),int num1,num2;,printf(n 请输入两个数:);,scanf(%d%d,printf(n 递增前值是%d 和%dn,num1,num2);,increment(,num1,num2,);,printf(n 递增后值是%d 和%dn,num1,num2);,void increment(,int val1,int val2,),val1+;,val2+;,printf(n 子函数中值%d 和%dn,val1,val2);,传值调用示例,请输入两个数,:,34 56,递增前值是,34,和,56,_,递增后值是,34,和,56,num1,num2,var1,34,56,var2,子函数中值是,35,和,57,35,34,56,57,num1,num2,34,56,34,56,FF23,FF05,调用后修改为35,val2,FFEA,FF45,将变量num1,值赋给形参val1,将变量num2,值赋给形参val2,val1,调用后修改为57,调用函数,被调用函数,第16页,16,void main(),int a=0;/,初始化a值为,0,func,(,/,调用函数,F,printf(%d,a);/,输出,a,结果,/,定义函数,F,void func(int*a),*a=10;/,让参数,a,等于,10,引用调用,FFE0,引用调用,a=FFE0,将会输出什么,第17页,17,#include,void increment(int*,int*);,void main(),int num1,num2;,printf(n 请输入两个数:);,scanf(%d%d,&num1,&num2,);,printf(n 递增前值是%d 和%dn,num1,num2);,increment(,printf(n 递增后值是%d 和%dn,num1,num2);,void increment(,int*ptr1,int*ptr2,),(*ptr1)+;,(*ptr2)+;,printf(n 子函数中值%d 和%dn,*ptr1,*ptr2);,引用调用示例,请输入两个数,:,45 67,递增前值是,45,和,67,_,递增后值是,46,和,68,num1,num2,ptr1,45,67,ptr2,子函数中值是,46,和,68,46,FF23,FF05,68,FF23,FF05,num1,num2,45,67,FF23,FF05,FF23,FF05,ptr2,FF45,FF51,调用前为45,调用后为46,将变量,num1,地址,赋给形参,即指针,ptr1,指向变量,num1,ptr1,调用前为67,调用后为68,将变量,num2,地址,赋给形参,即指针,ptr2,指向变量,num2,第18页,18,数组作为函数参数,在用数组作实参时,以传址方式调用函数,也就是说把实参数组首地址赋给形参,实际上形参数组和实参数组为同一数组,共同拥有一段内存空间,第19页,19,数组作为参数示例1,问题描述:,经过函数实现5个学员成绩排序。,#include,#define N 5,void sort(float a);,void main(),float gradeN;,int i;,printf(n 输入%d 个学员成绩:n,N);,for(i=0;iN;i+),scanf(%f,sort(grade);,printf(n 排序后成绩为:n);,for(i=0;iN;i+),printf(%5.2f,gradei);,printf(n);,传递数组时不使用,“,&,”,void sort(float aN),int i,j;float temp;,for(i=0;iN;i+),for(j=0;j aj+1),temp=aj+1;,aj+1=aj;,aj=temp;,第20页,20,问题描述:,经过函数实现求5个数中最大值。,#include,int find_larg(int*);,void main(),int arr15;,int i,larg_num;,printf(n 请输入 5 个不一样值,存放在一个数组中 n);,for(i=0;i=4;i+),scanf(%d,larg_num=,find_larg(arr1),;,printf(n 最大数是:%dn,larg_num);,数组作为参数示例2,int find_larg(int*ptr),int high=*ptr,i;,ptr+;,for(i=1;i=4;i+),if(high *ptr),high=*ptr;,ptr+;,return high;,第21页,21,总结 2-1,依据变量作用域能够将变量划分为:局部变量和全局变量,依据变量存放类型(决定生存期)将变量划分为:自动变量、存放器变量、静态变量、外部变量,静态局部变量生存期为整个源程序,但其作用域为定义该变量函数,第22页,22,总结 2-2,采取传值调用方式时,在被调用函数中改变形参值,只是改变其副本值,而不会影响调用函数中实参值,采取引用调用方式时,传递是变量地址值,这么在被调函数中,对形参操作实际上操作是实参本身,数组作为函数传递时,实际采取引用调用方式,第23页,23,
展开阅读全文