内容正文:
教案用纸
第 6 周 总第 17 次 学时:2
教学班级: 课程:C语言程序设计 授课教师:
课题:5.3 函数的参数传递
教学方法:讲授、启发
教具:常规教具
教学目标:使同学们掌握函数参数传递
教学重点:函数如何进行参数传递
教学难点:函数的地址传递方式
主要教学内容:
5.3 函数的参数传递
课后回顾:
教案用纸
四个一:
提问:字符数组的定义、赋值及使用。
导入:函数调用需要向子函数传递数据,一般是通过实参将数值传递给形参。实参向形参的参数传递有两种形式:值传递和地址传递。
正文:
5.3 函数的参数传递
函数调用需要向子函数传递数据,一般是通过实参将数值传递给形参。实参向形参的参数传递有两种形式:值传递和地址传递。
(1)值传递:是指单向的数据传递(将实参的值赋给形参),传递完成后,对形参的任何操作都不会影响实参的值。
(2)地址传递:将实参的地址传递给形参,使形参指向的数据和实参指向的数据相同(相当于实参和形参在内存中共用同一个空间),因而被调函数的操作会直接影响实参指向的数据。地址传递又称为指针传递或传址,在后面的指针章节中详细介绍。
下面通过一个案例来了解值传递和地址传递的特点。
【案例5-2】编写一个子函数change,有两个整型形参,在子函数中交换这两个形参的值。编写子函数add,有一个数组作为函数形参,在该函数中将数组中每个元素的值都乘2。通过该例程了解值传递和地址传递的区别。
程序分析
因为值传递后,形参值的改变不会影响到实参,所以在change子函数中交换两个形参值后输出这两个值,在主函数再重新输出两个实参值,会发现两个实参的值并没有改变。这也证明了值传递方式是单向的数据传递。
在add函数中将数组作为函数参数,则相当于实参和形参都共用同一个数组空间,那么对形参中每个数组元素值的改变,也同样对实参数组的每个值改变。在主函数中再输出实参的数组每个元素,可以发现,数组的元素值都被乘以2了。
要注意两个子函数的形参书写格式和两个子函数的调用格式。
编写程序代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* 案例5-2 函数值传递和地址传递例程 */
#include "stdio.h"
void change(int x,int y) /*该子函数功能是交换两个形参的值*/
{ int t;
printf("子函数change中两个参数交换前:x=%d,y=%d
",x,y);
t=x;
x=y;
y=t;
printf("子函数change中两个参数交换后:x=%d,y=%d
",x,y);
}
void add(int a[]) /*该子函数功能是批量将每个数组元素值乘2*/
{ int i;
for(i=0;i<10;i++)
a[i]*=2; /*每个数组元素的值乘2*/
}
void main()
{
int a,b,i;
int x[10]={1,3,5,7,9,11,13,15,17,19};
printf("请输入两个整数:");
scanf("%d%d",&a,&b);
change(a,b); /*子函数change调用语句*/
printf("主函数中两个实参在调用子函数change后的值为:a=%d,b=%d
",a,b);
printf("
原数组x中的10个元素值为:
");
for(i=0;i<10;i++)
printf("%5d",x[i]);
add(x); /*子函数add调用语句*/
printf("
调用子函数add后,数组x中的10个元素值为:
");
for(i=0;i<10;i++)
printf("%5d",x[i]);
}
调试运行程序
程序运行后,输入两个整数4和8,运行结果如下:
小结:
通过本次课的学习,大家应该掌握函数之间的数据传递方式。
备 注
重点:通过“问年龄”的故事讲解如何进行递归调用。
学科网(北京)股份有限公司
$$