资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,上一页,下一页,返回上一级,说明:,实参必需有确定的值,形参必需指定类型,形参与实参类型全都,个数一样,假设形参与实参类型不全都,自动按形参类型转换函数调用转换,形参在函数被调用前不占内存;函数调用时为形参安排内存;调用完毕,内存释放,1.形参与实参,实际参数(简称实参):调用函数时函数名后面括号中的表达式,形式参数(简称形参):定义函数时函数名后面括号中的变量名,void main(,)/*求三个整数之和*/,int threesum();,int a,b,c,sum;,scanf(,“%,d,%,d,%,d,”,&,a,&,b,&,c);sum=threesum(,a,b,c,);,printf(“sum is%d n”,sum);,int threesum(,int x,int y,int z,),int w;,w=x+y+z;,return(w);,函数参数及其传递方式,1,例、计算,x,3,#include,float cube(float x),return(x*x*x);,main,float a,product;,printf(“Please input value of a:“);,scanf(“%f”,/*输入1.2 给a*/,product=cube(a);,printf(”Cube of%.4f is%.4fn“,a,product);,x,a,product,不确定值,不确定值,1.2,1.2,1.728,形参,实参,返回值,安排变量存储空间,在不同的函数之间传递数据,可以使用的方法:,参数,:通过形式参数和实际参数,返回值,:用,return,语句返回计算结果,全局变量,:外部变量,在定义函数中指定的形参,在未消失函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数cube中的形参x才被安排内存单元。在调用完毕后,形参x 所占的内存单元也被释放。,2,参数传递方式,有两种 值传递方式 地址传递方式,(1)赋值传递方式,方式:函数调用时,为形参安排单元,并将实参的值复制到形参中;调用完毕,形参单元被释放,实参单元仍保存并维持原值。,特点:,假设实参是变量:形参与实参占用不同的内存单元,实参变量的值传递给形参变量。,假设实参是常量或表达式:实参的常量值或表达式值传递给形参变量。,赋值传递方式是单向值传递。,3,7,11,x,:,y,:,调用前:,调用结束:,7,11,x,:,y,:,例、交换两个数,#include,void main(),int x=7,y=11;,printf(“x=%d,ty=%dn“,x,y);,printf(“swapped:n“);,swap(x,y);,printf(“x=%d,ty=%dn“,x,y);,swap(int a,int b),int temp;,temp=a;a=b;b=temp;,调用时:,7,11,a,:,b,:,7,11,x,:,y,:,swap:,7,11,x,:,y,:,11,7,a,:,b:,7,temp,实参是变量:形参与实参占用不同的内存单元,实参变量的值传递给形参变量,实参值传递给形参,4,调用结束:,7,11,y,:,例、交换两个数,#include,void main(),int y=10;,printf(“x=%d,ty=%dn“,x,y);,printf(“swapped:n“);,swap(7,y+1);,printf(“x=%d,ty=%dn“,x,y);,swap(int a,int b),int temp;,temp=a;a=b;b=temp;,调用时:,7,11,a,:,b,:,7,y+1,swap:,7,11,y,:,11,7,a,:,b:,7,temp,实参是常量或表达式:实参的常量值或表达式值传递给形参变量,实参值传递给形参,11,y,:,调用前:,5,(2)赋地址传递方式,方式:函数调用时,将数据的存储地址作为参数传递给形参,特点:,假设实参是变量:形参与实参占用不同的内存单元,实参变量的地址值传递给形参变量。,假设实参是常量或表达式:实参的常量地址值或表达式的地址值传递给形参变量。,形参与实参指向一样的存储单元,由于形参与实参指向共同的存储单元,通过形参转变其所指向的数据单元的数据,在主调函数中可以通过实参访问,从而到达数据“双向”传递的作用参见接下来的例子,实参和形参必需是地址数据(地址变量、常量或表达式),地址值,传递仍然是,单向值,传递,形参和实参的,地址值,指向,同一区域,6,#include,swap(int*p1,int*p2),int p;,p=*p1;,*p1=*p2;,*p2=p;,void main(),int a,b;,scanf(“%d,%d“,printf(“a=%d,b=%dn”,a,b);,printf(“swapped:n”);,swap(,printf(”a=%d,b=%dn“,a,b);,例、交换两个数,a,5,9,b,调用前:,&a,&b,调用swap:,形参,p1,形参,p2,a,5,9,b,a,9,5,b,通过形参交换:,p1,&a,&b,p2,a,9,5,b,返回:,实参,&a,实参,&b,传递a、b的地址值,假设实参是常量或表达式:实参的常量地址值或表达式的地址值传递给形参变量,实参地址值传递给形参,通过指针变量承受地址值,*p2含义:访问p2指向的存储空间,由于形参与实参指向共同的存储单元,通过形参转变其所指向的数据单元的数据,在主调函数中可以通过实参访问,所以到达数据“双向”传递的作用,7,#include,long sum(int a,int b);,long factorial(int n);,main(),int n1,n2;,long a;,scanf(%d,%d,a=,sum(n1,n2);,printf(a=%,1d,a);,long sum(,int a,int b,),long c1,c2;,c1=,factorial(a);,c2=,factorial(b);,return(c1+c2);,long factorial(int n),long rtn=1;,int i;,for(i=1;i=n;i+),rtn*=i;,return(rtn);,long sum(int a,int b);,long factorial(int n);,文件包含编译预处理命令,函数类型说明,函数定义,函数调用,函数调用,函数返回值,形参,实参,8,
展开阅读全文