当前位置:文档之家› 《程序设计基础》函数参数的传递方式

《程序设计基础》函数参数的传递方式


#include <stdio.h> void swap(int a,int b); 调用: void main() { int x=7,y=11; swap(x,y); printf("x=%d,\ty=%d\n",x,y); swap: } 如何交换 x和 void swap(int a,int b)y { int temp; 的值呢 temp=a; a=b; b=temp; } 调用结束:
1 2 23 56 …. …. 88
19
#include <stdio.h> float average(int stu[10], int n); void main() { int score[10], i; float av; for( i=0; i<10; i++ ) scanf("%d", &score[i]); av=average(score,10); printf("Average is:%.2f", av); }
. . 9
实参用数组名
《程序设计基础》
19
示例
数组元素与数组名 作函数参数比较
传值
#include <stdio.h> void swap2(int x,int y) { int z; z=x; x=y; y=z; } void main() { int a[2]={1,2}; swap2(a[0],a[1]); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); }
7
7 11 temp
11
11 7
x:
7
y:
11
《程序设计基础》
10
10
(二)传地址
1. 传地址的含义
将实参的地址值(address)传递给对应的形参, 以便通过实参带回计算结果。
2. 两种实现方法
用指针作形参 用数组作形参
《程序设计基础》
11
11
二、地址作为形参(指针)
指针指向的对象类 型,也是b的类型
《程序设计基础》
26
26
二、函数的返回值(输出)
2.带多个返回值的函数
2)如果多个返回值的类型相同,含义相近,那么可用 数组作参数,把计算结果放在数组中带回。 3)将其中一个返回值由return语句带回,余下的返回值 (或所有返回值)用其他方法带回。例如,通过整体 量带回,通过指针类型的参数带回,通过引用型的参 数带回等。
形参数组大小(多维数组左起第一维)可不指定
《程序设计基础》
22
22
(二)传地址:多维数组作形参
例6 二维数组作形参的函数设计示例(求a[M][N]每行最 大元素值)。 #define M 4 #define N 5 //找出每一行的最大值,存到数组b中 void maxline(int a[M][N],int b[M] ) { int i,j,maxj; 函数头也可写成: for(i=0;i<M;i++) void maxline(int a[ ][N],int b[ ] ) { maxj=0; for(j=1;j<N;j++) if(a[i][j]>a[i][maxj]) maxj=j; 主调函数中若有定义 b[i]=a[i][maxj]; int x[M][N],y[M]; } 则可以调用函数: maxline(x,y) }
《程序设计基础》
27
27
二、函数的返回值(输出)
3. 不带返回值
例return; 无返回值函数 形式: void swap(int x,int y ) 或不写 { int temp; (1)不带返回值的函数往往用于进行某项操作 temp=x; (如对数据结构进行初始化)。 x=y; y=temp; (2)不带返回值的函数类型为 void。 return;//或不写return; (3) 函数体中可以使用返回语句“return;”终止函数的执 }
函数体 }
形参和局部量的作用消失
2
2
第11讲 函 数(2)
函数的参数传递(输入)
函数的返回值(输出) 参数选择原则与方法
《程序设计基础》
3
3பைடு நூலகம்
一、参数传递方式
参数是主调函数与被调函数之间联系的纽带,而参数传 递,则是建立这条纽带。
参数传递方式有: 传值
传地址
《程序设计基础》
4
4
(一)传值——最基本的传递方式
示例
1
2 调用前
《程序设计基础》
a x
1 2 调用
21
a x
2 1 交换
a
2 1 返回
21
(二)传地址: 多维数组作形参
参数传递方式与一维数组相同。也是将实参数 组的地址传递给形参数组。即传地址。
例如,二维数组x[3][5]作实参时,对应的形参数组a可 说明为: int a[3][5] 表示该数组有3行5列,元素类型为int。 或说明为: int a[ ][5] 表示该数组不知多少行,但知道每行有5列元素。
调用前:
a 5
b 10 a 5 b 10 a 10 b 5 b 5
14
p1 &a
调用时: p2 &b p1 &a 交换: p2 &b a 10
调用后:
14
二、地址作为形参(指针)
形实结合时的参数传递过程: 将变量a,b的地址值(&a,&b)传给形参p1和p2,使 形参p1和p2获得变量a,b的地址。 在被调函数体内,用*p1实现对变量a的间接存取,于是 当*p1被重新赋值时,实际上就是对实参a赋值,从而通 过*p1向a传回计算结果。
形参与实参指向相同的内存单元
《程序设计基础》
15
15
(二)传地址:数组作参数
1. 一般格式
形参数组的说明格式为:类型 x[N] 对应实参的格式为同类型某数组名: a
形参数组名
x是一维数组时,N可以省略,但方括号不能少。
《程序设计基础》
16
16
(二)传地址:数组作参数
在主调函数与被调函数分别定义数组,且类型应 一致 实参数组名是地址变量
1. 简单、常用 2. 形参是简单类型(整型、实型、字符型)、
结构类型或指针类型
3. 对应的实参是一个类型相同的表达式
《程序设计基础》
5
5
(一)传值——最基本的传递方式
传值方式的执行步骤: 进入函数体前,执行一条赋值语句: 形 = 实;
void main( ) { …… s=area(3,5); ……
例5 求学生的平均成绩
形参用数组定义, int stu[ ] float average(int stu[10], int n) { int i; float av,total=0; for( i=0; i<n; i++ ) total += stu[i]; av = total/n; return av; score stu } 0 12
《程序设计基础》
25
25
二、函数的返回值(输出)
2.带多个返回值的函数
1)用结构类型作为函数类型 例8 复数四则运算的函数设计 typedef struct //定义复数类型名 { double re,im; } cmplx; //定义返回值为复数类型的加运算函数 cmplx cadd(cmplx x, cmplx y) { cmplx a; a.re=x.re+y.re; a.im=x.im+y.im; return a; }
第十二讲
函 数(2)
回 顾
类型 函数名( 形式参数表 ) 函数的定义 { 局部量说明部分; 函数的调用 语句部分; 函数的返回值 } 函数名 (实在参数表); main() void p(形参表) { 执 { …… p( 实参表 ); 语句 s; }
《程序设计基础》
行 子 函 数 体
形参和局部量起作用
《程序设计基础》
调用前:
a:
10 10
a:
调用: x:
10
10 15 10
add:
a:
x:
调用结束:
a:
输出结果为: (两行数据) x=15 a=10
7 7
(一)传值——最基本的传递方式
函数调用时,为形参分配单元,并将实参的值复制到形参中; 调用结束,形参单元被释放,实参单元仍保留并维持原值
形参与实参占用不同的内存单元
13
13
交换两个数:传指针的方式
void swap(int *p1, int *p2) { int w; w=*p1; *p1=*p2; *p2=w; } void main() { int a=5,b=10; swap(&a,&b); printf(”a=%d,b=%d\n",a,b); }
《程序设计基础》
x
a a[0] a[1]
1
2 调用前
a a[0] a[1]
1 2
1 2 y
20
x 2 1 y 交换
a
1 2 返回
20
调用
《程序设计基础》
#include <stdio.h> void swap2(int x[]) 数组元素与数组名 { int z; 作函数参数比较 z=x[0]; x[0]=x[1]; x[1]=z; } void main() 传地址 { int a[2]={1,2}; swap2(a); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); } a
相关主题