方法一:常规法
老老实实传二维数组。
void print1(int arr[3][5], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
print1(arr, 3, 5);
return 0;
}
这段代码块,arr[3][5]里的3可省略,降维后与前一维度无关.但5不能省略,因为降维后的指针类型与元素个数有关,省略后指针会类型不明确.
方法二:传指针法
数组传参都会发生降维,降维成指向其内部元素的指针,因为二维数组被看成一个数组元素为一维数组的一维数组。所以在这里,二维数组arr降维成一个指向一维数组的指针,即(*arr)[5],这里与3也就没有任何关系了。
void print2(int (*arr)[5], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
print2(arr, 3, 5);
return 0;
}
方法三:一维数组打印法
在我所总结的关于规律里,认为所有的不管几维数组,都可以被看为一维数组。所以二维数组就是一维数组,只不过里面的元素为一维数组。所以我想要通过一维数组来打印二维数组。这里假设打印一个3行3列的数组。arr[3][3].
我们通过画图来找灵感:二维数组的下标我们很容易得到,现在问题是怎么得到这个一维数组的下标?我们先把我们需要的新下标列出来,然后再来寻找i,j和新下标之间的关系,通过观察我们能得到:新下标=i*row+j
那么代码如下:
void print3(int *arr, int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", arr[i*row+j]);
}
printf("\n");
}
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9};
print3(arr, 3, 3);
return 0;
}