例如:printf("%d",a);scanf("%d",&b);2)函数表达式:函数调用作为表达式中的一项出现在表达式中,用函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:returnx>y?x:y;z=max(x,y)3)函数实参:函数调用作为另1个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的【例】函数调用作为另1个函数调用的实际参数,求4个数的最大值#include<stdio.h>#include<conio.h>int max(int x,int y);mainOtint a,b,c,d,e;printf("a=");scanf("%d",&a);printf("b=");scanf("%d",&b);printf("c=");scanf("%d",&c);printf("d=");scanf("%d",&d);e=max(max(max(a,b),c),d);//函数作为实参被调用printf("max is %din",e);getchO;1int max(int x,int y)return x>y?x:y;1「函数调用时的参数传递主调函数把实参值复制给被调函数形参的过程,称为参数传递。参数传递方式:如果使用普通变量作为函数的参数进行调用,这种方式称为按值调用(CallbyValue)。如果使用地址型数据作为函数参数进行调用,则称为按地址调用(CallbyReference)。1.按值调用(CallbyValue)1)变量作为函数参数当形参和实参是基本型变量时,参数传递的方式是按值调用(CallbyValue),形参和实参各自占用不同的存储单元。因此,函数中形参的数值变化不会导致实参的相应变化。函数只能通过return语句返回1个函数值
例如: printf("%d",a); scanf("%d",&b); 2)函数表达式:函数调用作为表达式中的一项出现在表达式中,用函数返回 值参与表达式的运算。这种方式要求函数是有返回值的。 例如: return x>y?x:y; z=max(x,y) 3)函数实参:函数调用作为另1个函数调用的实际参数出现。这种情况是把该 函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的 【例】函数调用作为另1个函数调用的实际参数,求4个数的最大值 #include <stdio.h> #include <conio.h> int max(int x,int y); main(){ int a,b,c,d,e; printf("a=");scanf("%d",&a); printf("b=");scanf("%d",&b); printf("c=");scanf("%d",&c); printf("d=");scanf("%d",&d); e=max(max(max(a,b),c),d); //函数作为实参被调用 printf("max is %d\n",e); getch(); } int max(int x,int y){ return x>y?x:y; } l 函数调用时的参数传递 主调函数把实参值复制给被调函数形参的过程,称为参数传递。 参数传递方式: 如果使用普通变量作为函数的参数进行调用,这种方式称为按值调用(Call by Value)。 如果使用地址型数据作为函数参数进行调用,则称为 按地址调用(Call by Reference)。 1. 按值调用(Call by Value) 1) 变量作为函数参数 当形参和实参是基本型变量时,参数传递的方式是按值调用(Call by Value),形参和实参各自占用不同的存储单元。因此,函数中形参的数值变 化不会导致实参的相应变化。函数只能通过return语句返回1个函数值
按值调用采用的就是一种“单向的值传递方式,2)数组元素作函数实参数组是一种构造类型,其中数组元素的使用等同于基本型变量,因此数组元素作函数实参时,实参和形参间也是“单向值传递。而函数的形参仍然用基本型变量,当函数调用时,把作为实参的数组元素的值传送给形参变量,从而实现单向的值传递。【例5-7】的程序段:.....int a[5],i;printf("input 5 numbersIn");for(i=0;i<5;i++)scanf("%d",&a[i]);nzp(a[]);12.按地址调用(CallbyReference)当形参和实参是地址变量、指针变量或者数组名时,实参到形参的参数传递是地址值的传递,称为按地址调用(CallbyReference)。按地址调用采用的就是一种"双向"的地址传递方式。形参和实参此时指向同一存储单元,函数中形参的数值变化直接导致了实参的相应变化,函数也可以无须通过return语句返回函数值了。1)指针作函数形参指针作函数形参时,表示形参接收的数据只能是一个地址值。写一个新的swapO函数来尝试交换x,y的值:swap(int *a, int *b)int t;t=*a, *a=*b, *b=t;1【例】用指针作函数参数实现两个数的交换。2)数组名作为函数参数用不带方括号的数组名作为实参调用函数,可以把一个数组传递给一个函数用数组名作实参实际上是将数组的首地址传给被调函数,使形参数组与实参数组具有相同的首地址,实际占用同一段存储单元
按值调用采用的就是一种"单向"的值传递方式。 2)数组元素作函数实参 数组是一种构造类型,其中数组元素的使用等同于基本型变量,因此数组 元素作函数实参时,实参和形参间也是"单向"值传递。而函数的形参仍然用基 本型变量,当函数调用时,把作为实参的数组元素的值传送给形参变量,从而 实现单向的值传递。 【例5-7】的程序段: . . int a[5],i; printf("input 5 numbers\n"); for(i=0;i<5;i++){ scanf("%d",&a[i]); nzp(a[i]); } 2 .按地址调用(Call by Reference) 当形参和实参是地址变量、指针变量或者数组名时,实参到形参的参数传递是 地址值的传递,称为按地址调用(Call by Reference)。按地址调用采用的就 是一种"双向"的地址传递方式。形参和实参此时指向同一存储单元,函数中形 参的数值变化直接导致了实参的相应变化,函数也可以无须通过return语句返 回函数值了。 1)指针作函数形参 指针作函数形参时,表示形参接收的数据只能是一个地址值。 写一个新的swap()函数来尝试交换x,y的值: swap(int *a, int *b){ int t; t=*a, *a=*b, *b=t; } 【例】用指针作函数参数实现两个数的交换。 2 ) 数组名作为函数参数 用不带方括号的数组名作为实参调用函数,可以把一个数组传递给一个函数 。 用数组名作实参实际上是将数组的首地址传给被调函数,使形参数组与实参数 组具有相同的首地址,实际占用同一段存储单元