大学C语言课件函数课件.ppt
形参:定义函数时函数名后面括号中的变量名 实参:调用函数时函数名后面括号中的表达式 2. 函数的参数传递 调用关系 主调方 被调函数 调用 返回 形参和实参 对应关系 个数对应 顺序对应 类型对应 传递关系 实参传递给形参 值传递(单向传递) 2 3 2 3 x y b a 实参 形参 第*页 例6.2 从键盘输入10个整数,判断其中哪些是偶数。 问题分析:判断一个整数的奇偶性,可以通过该整数能否被2整除来确定。若该整数除以2的余数为0,则为偶数,否则为奇数。我们可以编写一个函数,用一个整数为形参,用返回值为1表示该数是偶数,返回值为0表示该数是奇数。 第*页 #include “stdio.h” int isEven(int a) { if(a%2==0) return 1; else return 0; } void main() { int i,x; for(i=0;i<10;i++) { scanf(“%d”,&x); if(isEven(x)==1) printf(“%d是偶数。\n”,x); else printf(“%d是奇数。\n”,x); } } 函数定义 实参 函数调用 形参 程序如下: 第*页 说明: (1)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。 因此,应预先用赋值、输入等办法,使实参获得确定的值。 (2)形参变量在函数定义时只起到一个占位符的作用,只有在函数被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。 因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。 (3)实参和形参占用不同的内存单元,即使同名也互不影响。 (4)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 第*页 例6.3 在函数中交换两个变量的值。 #include void swap(int x,int y) { int t; t=x; x=y; y=t; printf(“x=%d,y=%d\n”,x,y); } int main() { int a=1,b=2; printf(“a=%d,b=%d\n”,a,b); swap(a,b); printf(“a=%d,b=%d\n”,a,b); return 0; } a=1,b=2 x=2,y=1 a=1,b=2 ? 第*页 由运行结果可以看出,虽然在swap函数中交换了两个变量的值,但是在主函数中调用swap函数前后两个变量a、b的值并没有改变。这就是因为实参给形参进行的参数传递是单向的,形参虽然发生了改变,但并不会反过来影响到实参。这一过程可以由下图表示。 1 a b 1 a b 1 x 1 x 2 x 1 a y y y b 2 2 2 2 1 2 主函数 主函数 参数传递 被调函数 在学习了数组和指针之后,就可以在函数中交换变量值了。 注 第*页 3. 函数的返回值 函数处理信息的结果,由返回值带回。 一个函数最多只能有一个返回值。 没有返回值的函数,往往只关心执行过程。 函数的返回值是通过return语句实现的。 return (表达式); 或 return 表达式; 格式 例如:float abs(float f) { if(f>0) return f; else return –f; } 一旦return语句被执行,函数就把程序的控制权交回给主调方,并同时带回一个返回值。 return语句后的表达式类型应该与函数定义时的返回值类型一致。否则,系统将以函数的返回值类型为准,自动进行类型转换。 第*页 函数调用的过程 (1)程序在主调函数中执行,遇到函数调用,则在主调函数中暂停执行,保存上下文和当前指令地址; (2)为函数中的形参等分配内存,把实参的值按顺序复制到对应的形参变量中; (3)执行函数体中的语句,直到遇到return语句或函数体语句执行完毕为止; (4)计算return语句中的表达式的值,把该值转换为函数返回值类型;