极为隐蔽的错误:1.把二维数组的地址传给pScore指针时,不能用二维指针(没有定义)下标的方式来表示地址,而应该用列指针的方式i*n+j来计算地址。For example,不能用pScore[i][j]来表示score[i][j]的,而是应该用pScore[i*n+j](传给的是score的首地址)。
2.如果直接在main函数里给二维数组赋值,会出现错误的原因:因为二维数组score的列为5,而输入的n是小于5的。所以在输入的数据是保存在列为5的二维数组score中,当后面用指针*pScore指向二维数组score的时候,输入的地址pScore[i*n+j]表示在二维数组score里的顺序(还是5列)来的,for example:pScore[2*3+2]表示的是score[1*5+3],所以如果直接在main函数里给二维数组赋值的话,只需要把pScore[i*n+j]改成pScore[i*5+j]。所以还是建议用指针来给二维数组赋值。
我直接将用指针来给二维数组score赋值的代码是/*注释*/;
没有/*注释*/的是直接在main函数里给二维数组赋值的代码。
这也是我debug了许久才发现的错误原因,太累了(-'v'-)
#include <stdio.h>
#define STUD 30
#define COURSE 5
/*void Input(int *score,int m,int n);*/
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(void)
{
int i,j,m,n,score[STUD][COURSE],sum[STUD];
float aver[STUD];
printf("Enter the total number of students and courses:\n");
scanf("%d%d",&m,&n);
printf("Enter score:\n");
/* Input(*score,m,n);*/
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", &score[i][j]);
Total(*score,sum,aver,m,n);
Print(*score,sum,aver,m,n);
return 0;
}
/*void Input(int *pscore,int m,int n)
{
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
scanf("%d",&pscore[i*n+j]);
}*/
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*5+j];
printf("sum:%5d\n",sum[i]);
}
aver[i]=(float)sum[i]/n;
printf("aver:%6.1f\n",aver[i]);
}
}
void Print(int *pscore,int sum[],float aver[],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
for (j=0;j<n;j++)
printf("%4d\t",pscore[i*5+j]);
printf("%5d\t%6.1f\n",sum[i],aver[i]);
}
}