资源描述
回顾 2-1,函数是程序中的一个相对独立的单元或模块,;,使用函数带来的好处:程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性,;,自定义函数是用户在程序中根据需要而编写的函数。,回顾 2-2,函数的结构包括:返回值类型、函数名、参数列表、函数体,函数原型说明以便向编译器指出该函数使用什么样的格式和语法,函数调用时程序控制流将转向被调函数,被调函数执行结束时,控制流返回主调函数,return,语句用于向调用函数返回值,目标,理解两种参数传递的方式:传值、引用,熟练使用数组作为函数参数,理解变量的作用域,理解变量的存储类型,变量的作用域,作用域是某些事物起作用或,有效,的区域。,限于陆地,限于海洋,限于空中,程序中,变量也有不同的使用范围,,称为变量的作用域。变量的作,用域决定变量的,可访问性。,变量说明的,位置不同,,,其作用域也不同,。,C,语言中根据变量的作用域可以将变量分为,局部变量,和,全局变量,。,变量的作用域,void displayDiscount(),float discount_amt;,.,.,.,局部变量,:不能在函数外使用,float discount_amt;,void main(),.,.,void displayDiscount(),.,.,全局变量,:可以在整个程序中使用,局部变量,局部变量也称为,内部变量,。是指在一定范围内有效的变量。,C,语言中,在以下各位置定义的变量均属于局部变量。,在,函数体内定义的变量,,在本函数范围内有效,作用域局限于函数体内。,在,复合语句内定义的变量,,在本复合语句范围内有效,作用域局限于复合语句内。,有参函数的形式参数,也是局部变量,只在其所在的函数范围内有效。,int f1(int a),int b,c;,int f2(int x),int y,z;,main(),int m,n;,a,b,c,作用域:仅限于函数,f1(),中,x,y,z,作用域:仅限于函数,f2(),中,m,n作用域:仅限于函数main()中,a,b,c,x,y,z,m,n,都是局部变量,局部变量变量的作用域,#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,全局变量,全局变量(外部变量),:,在,函数外部,定义的变量。,全局变量的,作用域,从该变量,定义的位置开始到本源文件结束,变量一直有效。,在一个函数内变量所做的改变,将,影响其他函数中该变量的值,但需要注意的是,,如果定义了与全局变量同名的局部变量,则,局部变量优先,。,在引用全局变量时如果使用“,extern,”,声明全局变量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。,全局变量的作用域,#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,全局变量说明,全局变量的定义,必须在所有函数之外,且,只能定义一次,。,可以利用全局变量,使函数得到,一个以上的返回值,。,与局部变量不同,全局变量贯穿整个程序,并且可被任何一个模,块使用,它们在,整个程序执行期间保持有效,。,全局变量说明,建议在不必要时不要使用全局变量,原因如下:,全局变量可加强函数模块之间的数据联系,但又使这些函数依赖,这些外部变量,因而使得这些函数的独立性降低。,全局变量在整个程序执行期间均占有存储空间,而不是仅在需要,时才开辟单元,.,程序中大量使用全局变量,不可知的和不需要的副作用将可能导,致程序错误。降低程序的清晰性,.,在,同一源文件,中,允许全局变量和局部变量,同名,。,在局部变量的,作用域内,全局变量将被屏蔽而不起作用,。,void main(),int a=0;/,初始化,a,值为,0,func,(a);,/,调用函数,func,printf(%d,a);/,输出,a,的结果,/,定义函数,func,void func(int a),a=10;/,让参数,a,等于,10,传值调用,0,传值调用,将会输出什么,#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,调用函数,被调用函数,数组作为函数参数,在用数组作实参时,,以传,址,方式调用函数,,也就是说把实参数组的首地址赋给形参,实际上形参数组和实参数组为同一数组,共同拥有一段内存空间,数组作为参数示例1,问题描述:,通过函数实现5个学员成绩的排序。,#include,#define N 5,void sort(float);,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);,传递数组时不使用,“,&,”,演示:,示例5,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;,思考:,通过函数实现求5个数中的最大值。,数组作为参数示例2,
展开阅读全文