题目描述
输入一个n*m的二维数组(n,m<=5),求该数组中的最大值,要求使用元素指针实现
输入
第一行输入两个整数n和m
第二行输入n*m个整数
输出
输出最大值
样例输入
2 3 1 2 3 4 5 6
样例输出
6
#include <stdio.h>
main()
{
int a[5][5];
int * pa, i,n,m; //pa为指向数组元素的指针
int max,c,row,col;
pa=*a; //指针指向首元素
scanf("%d%d",&n,&m);
for(row=0;row<n*m;row++,pa++)
scanf("%d",pa); //pa需要向后移动
pa=*a; //指针重新指向首元素
max=*pa; //设第一个单元为最大值
for(i=0; i<n*m; i++)
{
if (max<*(pa+i))
{
max=*(pa+i);
}
}
printf("%d\n",max);
}
首先需要说明的是,pa是一个指针,它指向的是二维数组的一个元素,
pa=*a ,则代表pa被初始化为二维数组的第一个元素,因此要输入二维数组的首元素:scanf("%d",pa)而不是scanf("%d",*a)因为*a是二维数组本身,而不是其中的一个元素
row=0;row<m*n;row++,pa++适用于遍历二维数组的一个循环,他表示从二维数组的第一个元素开始,直到遍历完所有的元素为止
具体来说,这个循环做了以下几件事:
1.初始化row=0.
2.判断row二维数组的总行数(m*n)
3.如果row小于二维数组的总行数,则pa向后移动一位,并将row+1.
4.重复步骤2,3
这个循环可以遍历整个二维数组,因为row和pa分别表示行和列的位置
二维数组的总行数可以用m*n来表述,因为二维数组可以看走一个矩阵,其中每个元素都是一个一维数组,在矩阵中,每一行代表一个一维数组,每一列页代表一个一维数组,因此总行数就是一维数组的个数,而总列数就是每个一维数组的总长度
具体来书,如果一个二维数组可以看做是一个N行M列的矩阵,其中每个元素是一个一维数组,长度为M
需要注意的是,在循环中,我们使用了指针的递增操作,而不是使用了数组的索引,这是因为数组的内存是连续储存的,指针是通过递增操作依次访问数组的每一个元素的,而数组的索引需要用循环遍历整个数组,因此,使用指针递增操作可以更加高效的访问数组的元素