c语言关于二维数组列指针的有关问题

c语言关于二维数组列指针的问题
下面这个程序虽然没有warning,但是输出错误

此程序的目的的输入m个学生n门课程的成绩
计算每个学生的总成绩和平均成绩
并将其输出

本人一直在二维指针上有些许疑点,希望回答者稍微详细一点,吾将不胜感激

#include <stdio.h>
#include <stdlib.h>
#define STUD 30
#define COURSE 5
void Total(int *pScore,int sum[],float aver[],int m,int n);
void Print(int *pScore,int sum[],float aver[],int m,int n);

int main()
{
    int i,j,m,n,score[STUD][COURSE],sum[STUD];
    float aver[STUD];
    printf("How many student?");
    scanf("%d",&m);
    printf("How many courses?");
    scanf("%d",&n);
    printf("Input scores:\n");

    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&score[i][j]);
        }
    }

    Total(&score[0][0],sum,aver,m,n);
    Print(&score[0][0],sum,aver,m,n);

    return 0;
}

void Total(int *pScore,int sum[],float aver[],int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        sum[i]=0;
        for(j=0;j<n;j++)
        {
            sum[i]+=*(pScore+i*m+j);
        }
        aver[i]=(float)sum[i]/n;
    }
}

void Print(int *pScore,int sum[],float aver[],int m,int n)
{
    int i,j;
    printf("Result:\n");
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%4d\t",*(pScore+i*m+j));
        }
        printf("%5d\t%6.1f\n",sum[i],aver[i]);
    }
}
------解决思路----------------------
题主你好:
你的程序中指针的主要作用是为了便于调取数组中的数据。
------解决思路----------------------
题主你好:
程序中的指针用于调取数组中的数据。通过宏定义以及数组定义,你已完成了对某一数组(如score[STU][COURSE])中数据个数的定义。此时若用户输入的m,n值与你的STU、COURSE不一致,便会产生错误。
c语言关于二维数组列指针的有关问题
此处,你定义的学生人数为30,课程数目为5,但我输入的为2和2,不相符;
c语言关于二维数组列指针的有关问题
随后运行结果产生错误。
但如若m、n与STU、COURSE相符(此处我在程序中将STU、COURSE分别定义为5、2):
c语言关于二维数组列指针的有关问题
c语言关于二维数组列指针的有关问题
未发生数据错误。
------解决思路----------------------
如果允许用户录入小于数组数据个数的数据时,将你的:
c语言关于二维数组列指针的有关问题
改成
c语言关于二维数组列指针的有关问题
便不影响指针的正常访问。
------解决思路----------------------
因为
sum[i] += *(pScore + i * m + j);//sum[i] += pScore[i][j];效果不同,m<>STUD