C语言——指针(1.5用指针变量作函数参数的程序实例)

上一小节,我们了解了什么是按值调用模拟按引用调用,简单回顾一下,按值调用是通过变量的地址存储值,通过变量名访问值;模拟按引用调用则是采用指针解决问题的方式。在这一小节,我们将对指针变量作为函数参数的一些程序做一些实现。

练习:

例题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

显然,程序结果是对的,模拟按引用调用的方案解决了这个问题。这一小节加深了我们对单一返回值和多个返回值之间区别的印象,和按值调用和模拟按引用调用之间的区别。有兴趣的小伙伴可以自己敲一下代码感受一下哦!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值