这里我将在二维数组中的一些基本操作进行一次整理:
编码思路:
1.inputTwoArry 输入函数 用于二维数组的初始化。(也就是赋值)
实现:给函数中传入要初始化数组的地址,行列大小。(int a[][N],int m,int n) 注意 二维数组做参数需要确定列数。
2.outputTwoArry1 输出函数 用于二维数组打印输出。(一般实现方法,需要先确定二维数组的列数 a[][N])
实现:类似输入函数与其参数相同。也用了两层循环将数组中每一个元素打印输出。用a[i][j]的方式获取元素并输出。
3.outoutTwoArr2 输出函数 也是用于二维数组的打印输出。(以指针的方式打印输出,不需要传入指定的列数。便于转置后输出)
实现:传参发生变化,将数组参数改为了指针。增强了函数的灵活性。用此函数即可以输出原数组也可以输出转置后的数组。
[首先需要理解一下,二维数组其实际意义上就是一维数组的集合。如 a[m][n] 是一个m行n列的数组。可以看做是一个二维数组内存储了 m个 一维数组,而这个一维数组a[m]中的每一个元素空间里面存储的又是 一个长度为n的一维数组。或者可以将 a[i] 看做是该行元素的数组名。即此二维数组中的第一个数组是a[0][n],第二个数组是a[1][n],a[0]、a[1]就是相应数组的数组名。]
(在我看来能够理解以上所述,会对理解二维数组有很大的帮助。甚至其他的多维数组都可以这样理解,然后化繁从简的去使用数组。其实所有的多维数组都是由一维数组,组合得来的!)
其实遍历二维数组都是一行一行遍历。从a[0]~a[m-1],遍历第一行时就是从a[0][0]~a[0][n-1]。所以只要知道了数组的大小是m*n也可以指针的方式(*p)来一个个遍历数组元素。也就变成了用一层循环输出m*n个元素。只要确定传入的m为行,n为列。在输出时用n的值来确定换行即可,达到与上一个输出函数一样的输出效果。另外注意在调用时,第一个参数应该传入给数组的首地址
即outTwoArr2(a[0],m,n);//此处a[0][0]和a[0]传入的地址值相同。所以均可使用。
4.reverse 函数 用于二维数组的转置。函数声明为:void Reverse(int a[][N],int b[][M],int m,int n);
a[][N]为原数组,b[][M]用于储存转置数组的元素。m,n用于确定数组的大小,即数组元素的个数。
我在写完这个函数后,在函数输出时发现无法使用outTwoArr1对转置后的数组进行输出,因为outTwoArr1函数,在传参时用的是二维数组,要先确定列数。而原始二数组转置后 数组行列数发生了变化,无法对转置后的数组输出。所以才想到outTwoArr2 以指针的形式输出。这样在传参时无需确定列数,那么也就是只要确定了数组大小,传参正确。原始数组和转置后的数组都能用outTwoArr2函数输出。
编码实现:
#include <stdio.h>
const int M=3;
const int N=4;
//二维数组输入
void inputTwoArry(int a[][N],int m,int n);
//输出 限定数组大小
void outputTwoArry1(int a[][N],int m,int n);
//输出 不限数组大小
void outputTwoArry2(int *a,int m,int n);
//转置
void Reverse(int a[][N],int b[][M],int m,int n);
int main(int argc, char* argv[])
{
int arr[M][N];//原数组
int brr[N][M];//转置后的数组
printf("请输一个3*4二维数组的元素值:\n");
inputTwoArry(arr,M,N);
printf("output this array:\n");
outputTwoArry1(arr,M,N);
//也可使用
//outputTwoArry2(arr[0],M,N);
printf("\noutput this array reverse:\n");
Reverse(arr,brr,M,N);
outputTwoArry2(brr[0],N,M);
//outputTwoArry1(brr,M,N);
return 0;
}
//输入
void inputTwoArry(int a[][N],int m,int n)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
}
//输出
void outputTwoArry1(int a[][N],int m,int n)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
}
//输出 不限数组大小
void outputTwoArry2(int *a,int m,int n)
{
int* p=a;
for(int i=0;i<m*n;p++,i++)
{
printf("%4d",*p);
if((i+1)%n==0)
{
printf("\n");
}
}
}
//转置
void Reverse(int a[][N],int b[][M],int m,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
b[i][j]=a[j][i];
}
}
}
运行结果: