您好,欢迎访问三七文档
1带参数的函数第十章2回顾2-1函数是程序中的一个相对独立的单元或模块使用函数带来的好处:程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性C语言提供了极为丰富的内置函数,要使用这些内置函数,需要在程序前包含相应的头文件自定义函数是用户在程序中根据需要而编写的函数3回顾2-2函数的结构包括:返回值类型、函数名、参数列表、函数体函数原型说明以便向编译器指出该函数使用什么样的格式和语法函数调用时程序控制流将转向被调函数,被调函数执行结束时,控制流返回主调函数return语句用于向调用函数返回值4目标理解变量的作用域理解变量的存储类型理解两种参数传递的方式:传值、引用熟悉带参函数的调用熟练使用数组作为函数参数5变量的作用域4-1作用域是某些事物起作用或有效的区域。限于陆地限于海洋限于空中6程序中变量也有不同的使用范围,称为变量的作用域。变量的作用域决定变量的可访问性变量的作用域4-2voiddisplayDiscount(){floatdiscount_amt;.........}局部变量:不能在函数外使用floatdiscount_amt;voidmain(){......}voiddisplayDiscount(){......}全局变量:可以在整个程序中使用7变量的作用域4-3#includestdio.hvoidaddNumbers(){intnum1,num2,sum;printf(\n请输入两个数:);scanf(%d%d,&num1,&num2);sum=num1+num2;printf(子函数中sum的值是%d\n,sum);}voidmain(){intsum=0;addNumbers();printf(\n主函数中sum的值是%d\n,sum);}内存sumnum2045num1请输入两个数:5645子函数中sum的值是101主函数中sum的值是056sum1018变量的作用域4-4#includestdio.hintsum=0;voidaddNumbers(){intnum1,num2;printf(\n请输入两个数:);scanf(%d%d,&num1,&num2);sum=num1+num2;printf(子函数中sum的值是%d\n,sum);}voidmain(){addNumbers();printf(\n主函数中sum的值是%d\n,sum);}内存sumnum2045num1请输入两个数:5645子函数中sum的值是101主函数中sum的值是101561019局部变量小结局部变量是在函数内作定义说明的变量,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时主函数中也不能使用其他函数中定义的局部变量。形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的内存单元,互不干扰。10全局变量小结全局变量是在函数外部定义的变量,它不属于哪一个函数,而是属于一个源程序文件。其作用域是整个源程序。不是所有全局变量都可以直接使用,只有定义在该函数之前的全局变量,才能在该函数中使用。如果同一个程序的多个函数都操纵同一个变量,全局变量会比较有用。外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,使得函数的独立性降低。从模块化程序设计的观点来看这是不利的,因此在不必要时尽量不要使用全局变量。在同一个源文件中,允许全局变量和局部变量同名。在同名的局部变量的作用域中,全局变量不起作用。11存储类型2-1变量的存储方式可分为“静态存储”和“动态存储”两种静态存储变量是一直存在的,而动态存储变量则时而存在时而消失这种由于变量存储方式不同而产生的特性称为变量的生存期生存期表示了变量存在的时间12静态局部变量静态局部变量生存期为整个源程序静态局部变量作用域与自动变量相同,即只能在定义该变量的函数内使用该变量对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值函数被调用时,其中的静态局部变量的值将保留前次被调用的结果13静态局部变量示例voidformat(){staticintm=0;m++;if(m%10==0)putchar('\n');elseputchar('');}voidmain(){inti;for(i=0;i50;i++){printf(%d,i);format();}}内存i0m011循环执行50次494901012345678910111213141516171819202122232425262728293031323334353637383940414243444546474849214函数形参和实参voidmain(){......display(10,20.5);}display(intnum,floatfraction){......}实际参数函数调用形式参数15voidmain(){inta=0;//初始化a值为0func(a);//调用函数funcprintf(%d,a);//输出a的结果}//定义函数funcvoidfunc(inta){a=10;//让参数a等于10}传值调用0传值调用将会输出什么16#includestdio.hvoidincrement(int,int);voidmain(){intnum1,num2;printf(\n请输入两个数:);scanf(%d%d,&num1,&num2);printf(\n递增前的值是%d和%d\n,num1,num2);increment(num1,num2);printf(\n递增后的值是%d和%d\n,num1,num2);}voidincrement(intval1,intval2){val1++;val2++;printf(\n子函数中值%d和%d\n,val1,val2);}传值调用示例请输入两个数:3456递增前的值是34和56_递增后的值是34和56num1num2var13456var2子函数中的值是35和5735345657num1num234563456FF23FF05调用后修改为35val2FFEAFF45将变量num1的值赋给形参val1将变量num2的值赋给形参val2val1调用后修改为57调用函数被调用函数17voidmain(){inta=0;//初始化a值为0func(&a);//调用函数Fprintf(%d,a);//输出a的结果}//定义函数Fvoidfunc(int*a){*a=10;//让参数a等于10}引用调用FFE0引用调用a=FFE0将会输出什么18#includestdio.hvoidincrement(int*,int*);voidmain(){intnum1,num2;printf(\n请输入两个数:);scanf(%d%d,&num1,&num2);printf(\n递增前的值是%d和%d\n,num1,num2);increment(&num1,&num2);printf(\n递增后的值是%d和%d\n,num1,num2);}voidincrement(int*ptr1,int*ptr2){(*ptr1)++;(*ptr2)++;printf(\n子函数中值%d和%d\n,*ptr1,*ptr2);}引用调用示例请输入两个数:4567递增前的值是45和67_递增后的值是46和68num1num2ptr14567ptr2子函数中的值是46和6846FF23FF0568FF23FF05num1num24567FF23FF05FF23FF05ptr2FF45FF51调用前为45调用后为46将变量num1的地址赋给形参,即指针ptr1指向变量num1ptr1调用前为67调用后为68将变量num2的地址赋给形参,即指针ptr2指向变量num219数组作为函数参数在用数组作实参时,以传址方式调用函数,也就是说把实参数组的首地址赋给形参实际上形参数组和实参数组为同一数组,共同拥有一段内存空间20数组作为参数示例1问题描述:通过函数实现5个学员成绩的排序。#includestdio.h#defineN5voidsort(floata[]);voidmain(){floatgrade[N];inti;printf(\n输入%d个学员的成绩:\n,N);for(i=0;iN;i++)scanf(%f,&grade[i]);sort(grade);printf(\n排序后的成绩为:\n);for(i=0;iN;i++)printf(%5.2f,grade[i]);printf(\n);}传递数组时不使用“&”voidsort(floata[N]){inti,j;floattemp;for(i=0;iN;i++){for(j=0;jN-i-1;j++){if(a[j]a[j+1]){temp=a[j+1];a[j+1]=a[j];a[j]=temp;}}}}21问题描述:通过函数实现求5个数中的最大值。#includestdio.hintfind_larg(int*);voidmain(){intarr1[5];inti,larg_num;printf(\n请输入5个不同的值,存储在一个数组中\n);for(i=0;i=4;i++){scanf(%d,&arr1[i]);}larg_num=find_larg(arr1);printf(\n最大的数是:%d\n,larg_num);}数组作为参数示例2intfind_larg(int*ptr){inthigh=*ptr,i;ptr++;for(i=1;i=4;i++){if(high*ptr)high=*ptr;ptr++;}returnhigh;}22总结2-1根据变量的作用域可以将变量划分为:局部变量和全局变量根据变量的存储类型(决定生存期)将变量划分为:自动变量、寄存器变量、静态变量、外部变量静态局部变量的生存期为整个源程序,但其作用域为定义该变量的函数23总结2-2采用传值调用方式时,在被调用函数中改变形参的值,只是改变其副本值,而不会影响调用函数中实参值采用引用调用方式时,传递的是变量的地址值,这样在被调函数中,对形参的操作实际上操作的是实参本身数组作为函数传递时,实际采用引用调用方式
本文标题:C语言带参数的函数
链接地址:https://www.777doc.com/doc-7290426 .html