C语言学习|向函数传递二维数组
用二维数组的数组名作为函数的参数,向被调函数传递数组的起始地址,可以向函数复制全部数组元素所需的开销。与函数形参被声明为一维数组时所不同的是当形参被定义为二维数组的时候,不能省略数组第二维的长度,仅可以省略数组的第一维的长度。
其原因为:C编译器必须已知每列的长度,才能对二维数组元素进行正确的寻址操作,否则编译器无法确定第二行的数组元素从那里开始存取。
例如,定义一个3行4列的二维数组,则接收这个二维数组的函数add可以定义为:
void add(int array[3][4])
{
……
}
还可以定义为:
viod add(int array[][4])
{
……
}
但是绝对不能定义为:
viod add(int array[][])
{
……
}
其原因是C语言中的二维数组都是按列存储,编译器需要根据函数形参列表提供的列下标值(列数,即每行中的元素个数)来告诉函数如何在一个二维数组中定义一个数组元素。二维数组的一行实质上就是一个一维数组。为了在某个特定的行中找到某个元素,编译器就必须知道一行中有多少个元素,这样才能跳过适当数量的存储单元来准确地找到要访问的数组元素。
因为二维数组的列数已经在方括号里指定,所以只要在参数中指定数组的行数即可。这样,在函数中访问二维数组的元素,只需要保证二维数组元素的行、列下标大于或等于0且小于数组的行数和列数即可。
二维数组的运用例子:
某班期末考试科目为数学(mt)、英语(en)和C语言(cl),有最多不超过30人参加考试。为评定奖学金,要求按如下格式输出学号、各科分数、总分和平均分,并且标出三门课均在90分(含90分)以上者(用“Y”和“N”来标注)。
编写的程序如下:
#include<stdio.h>
#defineSTUD30 //最多学生人数
#defineCOURSE3 //考试科目数
int input(long num[],int score[][COURSE]);
voidtotal(int score[][COURSE],int sum,floataver[],int n);
voidprint(long num,int score[][COURSE],int sum[],float aver[],int n);
int main()
{
int n,score[STUD][COURSE],sum[STUD];
longnum[STUD];
floataver[STUD];
n=input(num,score);
total(score,sum,aver,n);
print(num,score,sum,aver,n);
return 0;
}
//函数用于输入参加考试学生的学号和COURSE门课程的成绩,函数返回参加考试的学生人数
int input(long num[],int score[][COURSE]);
{
int i,j,n;
printf("Please enter the total number of the students(n<=30):");
scanf("%d",&n);//输入参加考试的学生人数
printf("Enter No. and score as:mt,en,cl\n");
for(i=0;i<n;i++)
{
scanf("%ld",&num[i]);//以长整型格式输入每个学生的学号
for(j=0;j<COURSE;j++)
{
scanf("%d",&score[i][j]);//输入每个学生的各门课程成绩
}
}
return n;//返回参加考试的学生人数
}
//函数用于统计整型数组score中存储的每个学生的总分和平均分
voidtotal(int score[][COURSE],int sum,floataver[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
sum[i]=0
for(j=0;j<COURSE;j++)//对每个学生进行以下的计算
{
sum[i]+=score[i][j];//计算第i+1个学生各门课总分
}
aver[i]=(float)sum[i]/COURSE;//计算第i+1个学生平均分
}
}
//函数用于输出每个学生的学号、各门课程成绩、总分、平均分以及能否获得奖学金等信息
voidprint(long num,int score[][COURSE],int sum[],float aver[],int n)
{
int i,j;
char c[STUD];用来记录每个学生能否获得奖学金,三门都在90分以上才能获得
printf("Result:\n");
printf(" No \t nt \t en \t cl \t sum \t aver \t>90\n");
for(i=0;i<n;i++)//输入n个学生的成绩
{
c[i]='Y';//先假设该生能获得奖学金
printf("%4ld\t",num[i]);//输出学号
for(j=0;j<COURSE;j++)
{
printf("%4d\t",score[i][j]);
if(score[i][j]<90)
c[i]='N';//一旦发现条件不符则标记为不能获得
}
printf("%5d\t%6.1f\t %c \n",sum[i],aver[i],c[i]);
}
}
程序运行结果如下:
Please enter the total number of the students(n<=30):3(按回车)
Enter No. and score as:mt,en,cl
2019001 97 92 87(按回车)
2019002 92 90 91(按回车)
2019003 90 82 81(按回车)
Result:
No mt en cl sum aver >90
2019001 97 92 87 276 92.0 N
2019002 92909127391.0 Y
2019003 90828125384.3 N
请先 后发表评论~