二维数组函数传递讲义
例题1(引例):
输入两个数a,b(0<a,b<10),输出一个二位数,其中a做十位,b做个位。
#include<stdio.h>
void print(int num[][10],int i,int j)
{
printf("%d\n",num[i][j]);
}
int main()
{
int num[10][10],i,j,a,b;
for(i=0;i<10;i++) for(j=0;j<10;j++) num[i][j]=10*i+j;
scanf("%d %d",&a,&b);
print(num,a,b); //函数打印法
printf("%d\n",num[a][b]); //直接打印法
}
在C语言中,可以在所有函数之外的位置定义全局变量,但是如果定义的全局变量是数组,而且大小需要输入而决定,此时定义全局变量的数组就不是非常方便的了。所以此时需要在主函数中先输入数组的大小,再定义数组。但是我们如果还需要对该数组进行操作,那么则需要对数组进行传递了。
数组与指针
数组和指针有密不可分的联系,数组是对连续n个地址的赋值,而指针是指向一个地址,随着指针的移动,所指向的数组的元素依次变化。所以,在引例中,如果我们做对二维数组取地址操作,可得以下结果。
printf("num=%d &num=%d\n",num,&num);
/*
在编者电脑运行所得结果如下:
num=6487216
&num=6487216
在不同的环境下,num的值不一定相同,但形式相近
*/
可显而知,数组对应的名字自身便是一个指针,而且此时是否对num取地址对所对应地址没有影响。
函数与传递
此时向print函数传递的第一个整形变量即是num的地址,而在print函数的声明中明确了数组num的第二维的大小,这样做的目的是为了让数组在传递过程中不丢失二维数组的维度,若不定义第二维的大小的话,函数便会出错。同时,第二维的数据可以让指针指向二维数组中的具体某一个元素。
例题2(XDOJ1378):
(简化版描述) 先定义一个m*n的矩阵,在接下来的time次操作中,输入u,v,使得(1,1)至(u,v)的矩形区域的每一个位置的数自增一次。之后依次打印各位的大小。
#include<stdio.h>
int m,n;
void counts(int a[][n],int x,int y)
{
int i,j,ans=0;
for(i=0;i<x;i++) for(j=0;j<y;j++) a[i][j]++;
}
int main()
{
int time,i,u,v,j,t;
scanf("%d %d %d",&m,&n,&time);
int a[m][n];
memset(a,0,sizeof(a));
for(i=0;i<time;i++)
{
scanf("%d %d",&u,&v);
counts(a,u,v);
}
for(i=0;i<m;i++) for(j=0;j<n;j++) printf("%d\n",a[i][j]);
return 0;
}