上一小节,我们了解了什么是按值调用和模拟按引用调用,简单回顾一下,按值调用是通过变量的地址存储值,通过变量名访问值;模拟按引用调用则是采用指针解决问题的方式。在这一小节,我们将对指针变量作为函数参数的一些程序做一些实现。
练习:
例题1.5从键盘输入某班学生某门课的成绩(每班人数最多不超过40人,具体人数由键盘输入),试分析下面的程序能否实现计算并输出最高分及相应的学生的学号。
#include <stdio.h>
#define N 40
void FindMax(int score[],long num[],int n,int pMaxScore,long pMaxNum)
{
int i;
pMaxScore=score[0];//假设第一个同学为最高分
pMaxNum=num[0];//记录当前学生学号
for (i=1;i<n;i++)
{
if (score[i]>pMaxScore)//获得最高分
{
pMaxScore=score[i];//不用交换,直接覆盖值
pMaxNum=num[i];
}
}
}
int main()
{
int score[N],maxScore;
int n,i;
long num[N],maxNum;
printf("How many students?\n");
scanf("%d",&n);
printf("Input students's ID and score:\n");
for (i=0;i<n;i++)
{
scanf("%ld%d",&num[i],&score[i]);
}
FindMax(score,num,n,maxScore,maxNum);
printf("maxScore=%d,maxNum=%ld\n",maxScore,maxNum);
return 0;
}
其运行结果如下:
How many students?
2
Input students's ID and score:
2020212100 85
2020212101 95
maxScore=16,maxNum=0
很显然,这并不是我们想要的答案,我们试着找一下程序问题所在,发现函数并没有返回值,并且我们需要的应该是两个返回值,上一小节,我们说了,如果单一返回值时,可以用按值调用且加return 变量 的形式,但是FindMax这个函数,我们要返回两个值,maxScore和maxNum,显然,我们只能用模拟按引用调用,调试程序如下:
#include <stdio.h>
#define N 40
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum)
{
int i;
*pMaxScore=score[0];//假设第一个同学为最高分
*pMaxNum=num[0];//记录当前学生学号
for (i=1;i<n;i++)
{
if (score[i]>*pMaxScore)//获得最高分
{
*pMaxScore=score[i];//不用交换,直接覆盖值
*pMaxNum=num[i];
}
}
}
int main()
{
int score[N],maxScore;
int n,i;
long num[N],maxNum;
printf("How many students?\n");
scanf("%d",&n);
printf("Input students's ID and score:\n");
for (i=0;i<n;i++)
{
scanf("%ld%d",&num[i],&score[i]);
}
FindMax(score,num,n,&maxScore,&maxNum);
printf("maxScore=%d,maxNum=%ld\n",maxScore,maxNum);
return 0;
}
其结果运行如下:
How many students?
2
Input students's ID and score:
2020212100 85
2020212101 95
maxScore=95,maxNum=2020212101
显然,程序结果是对的,模拟按引用调用的方案解决了这个问题。这一小节加深了我们对单一返回值和多个返回值之间区别的印象,和按值调用和模拟按引用调用之间的区别。有兴趣的小伙伴可以自己敲一下代码感受一下哦!