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

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

上一篇:vue移动端图片曝光


下一篇:力扣 53. 最大子序和