内容正文:
第六章 程序的模块化--函数
1
CONTENTS
目录
01
02
函数的分类
函数的认知
03
自定义函数及其应用
04
函数的调用
CONTENTS
目录
05
06
函数的递归调用
函数的嵌套调用
07
数组作为函数的参数
08
变量的作用域
C语言
知识树
My First Template
数组作为函数的参数
C语言程序设计
5
C语言
参数传递方式
1、值传递方式
方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值
特点:形参与实参占用不同的内存单元,单向传递。
2、址传递方式
方式:函数调用时,将数据的存储地址作为参数传递给形参
特点:形参与实参占用同样的存储单元;“双向”传递;实参和形参必须是地址常量或变量
地址:ED2F
形参
5
实参
地址:EF3D
5
地址:ED2F
形参
实参
地址:EF3D
5
EF3D
8
数组作为函数的参数
My First Template
C语言
数组元素作为函数实参(值传递):
值传递过程中的实参可以是常量、变量、表达式。数组元素的作用和变量一样,凡是变量可以出现的地方,均可用数组元素代替,因此数组元素作为函数实参的用法和变量相同;
数组名作为函数实参(址传递):
把数组名作为函数的形参和实参使用,传递的是数组第一个元素的地址
数组作为函数的参数
数组作为函数的参数
My First Template
C语言
数组元素作为函数实参(值)
数组作为函数的参数
数组元素就是下标变量,它与普通变量没有区别,数组元素可以作为函数的实参,不能作为形参。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
实例:输出数组中所有大于0的元素。
#include <stdio.h>
void panduan(int v)//封装函数,判断v对应的值是否大于0
{
if(v>0)
{
printf("%d ",v);//如果大于0则输出
}
}
void main()//主函数
{
int a[5],i;//定义数组及循环变化因子i
printf("请输入五个数组元素以空格分隔
");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
panduan(a[i]);//调用函数判断
}
}
My First Template
C语言
1、用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。
2、在用数组名作函数参数时,不是值传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。
3、数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送就是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就指向了实参数组所在的地址空间。
4、实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
数组名作为函数的实参(址)
函数的调用—相关知识
My First Template
C语言
数组名作为函数的实参(址)
函数的调用—相关知识
实例:通过函数实现5个学生成绩的排序。
#include <stdio.h>// 预处理
#define N 5 //定义长度5
void sort(float[]);//函数声明
void main()//主函数
{
float grade[N];
int i;
printf("输入 %d 个学员的成绩:
",N);
for(i=0;i<N;i++)
{
scanf("%f",&grade[i]);
}
sort(grade);//调用函数排序
printf("排序后的成绩为:
");
for(i=0;i<N;i++)//输出排序后的结果
{
printf("%5.2f ",grade[i]);
}
printf("
");
}
void sort(float a[N])//封装排序函数
{
int i,j; float temp;
for(i=0;i<N;i++)
{
for(j=0;j<N-i-1; j++)
{
if(a[j] > a[j+1])
{//如果 a[j] > a[j+1]则交换
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
}
My First Template
变量的作用域
C语言程序设计
11
C语言
变量的作用范围称为变量的作用域,变量定义的位置决定了其作用域。变量除了可以定义在函数内,也可以定义在函数外。C语言的变量,按着作用域可分为局部变量和全局变量
变量的作用域
变量的作用域
作用域是某些事物起作用或有效的区域。
限于陆地
限于海洋
限于空中
My First Template
C语言
程序中变量也有不同的使用范围,称为变量的作用域。变量的作用域决定变量的可访问性,根据变量的作用范围不同,可以分为局部变量和全局变量。
变量的作用域
变量的作用域
void f1(int age)
{
float money;
. . .
. . .
. . .
}
局部变量:不能在函数外使用
float money;
void main()
{
. . .
. . .
}
void f1(int age)
{
. . .
. . .
}
全局变量:可以在整个程序中使用
My First Template
C语言
本次任务
使用函数结合变量的作用域,计算两个数的和(输出两次)
变量的作用域
My First Template
C语言
变量的作用域
任务初探
#include <stdio.h>
int sum=0;
void addNumbers()
{
int num1,num2;
printf("
请输入两个数:");
scanf("%d %d",&num1,&num2);
sum=num1+num2;
printf(" 子函数中 sum 的值是 %d
",sum);
}
void main()
{
addNumbers();
printf("
主函数中 sum 的值是 %d
",sum);
}
内存
sum
num2
0
22
num1
请输入两个数:11 22
子函数中sum的值是33
主函数中sum的值是33
11
33
My First Template
C语言
变量的作用域
任务实现
#include <stdio.h>
void addNumbers()
{
int num1,num2,sum;
printf("
请输入两个数:");
scanf("%d %d",&num1,&num2);
sum=num1+num2;
printf(" 子函数中 sum 的值是 %d
",sum);
}
void main()
{
int sum=0;
addNumbers();
printf("
主函数中 sum 的值是 %d
",sum);
}
内存
sum
num2
0
22
num1
请输入两个数:11 22
子函数中sum的值是33
主函数中sum的值是 0
11
sum
33
My First Template
$$