二维数组函数传递笔记

二维数组函数传递讲义

例题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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值