1 遍历方法1:最为通俗易懂,是常规的入参方式。
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
printf1(arr, 2);
return 0;
}
void printf1(int arr[2][3], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
printf("第%d行%d列:%d\n", i, j, arr[i][j]);
}
}
}
2 遍历方法2:和方法1基本相同。
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
printf2(arr, 2);
return 0;
}
void printf2(int arr[][3], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
printf("第%d行%d列:%d\n", i, j, arr[i][j]);
}
}
}
3 遍历方法3:和方法1和2的基本原理相同,传入的都是二维数组首地址(即第一行数组的地址)。
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
printf3(arr, 2);
return 0;
}
void printf3(int (*arr)[3], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
printf("第%d行%d列:%d\n", i, j, arr[i][j]);
}
}
}
4 遍历方法4:传入首个元素的地址,再依据数据地址的连续性依次输出。
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
printf4(&arr[0][0], 2);
return 0;
}
void printf4(int *p, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
printf("第%d行%d列:%d\n", i, j, *(p+i*3+j));//3为每行的元素个数
}
}
}
5 遍历方法5:传入的是二维指针,力扣算法题中很常见。需要开辟新的空间实现。
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
int **p = (int **)malloc(sizeof(int *) * 2); // 2表示行数,开辟行空间
for (int i = 0; i < 2; i++)
p[i] = (int *)malloc(sizeof(int) * 3); // 3为每行的元素个数(列空间)
for (int i = 0; i < 2; i++) //把原数组数据放到开辟的空间中
for (int j = 0; j < 3; j++)
p[i][j] = arr[i][j];
printf5(p, 2, 3);
for (int i = 0; i < 2; i++)
free(p[i]);
free(p);
return 0;
}
void printf5(int **p, int n, int col)//若每行列数不同,要传入int* col
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < col; j++)
{
printf("第%d行%d列:%d\n", i, j, p[i][j]); // 3为每行的元素个数
}
}
}
6 遍历方法6:传入二维指针,涉及指针之间的类型转换,最为简单。
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}};
printf6((int **)arr, 2, 3);
return 0;
}
void printf6(int **p, int n, int col)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < col; j++)
{
printf("第%d行%d列:%d\n", i, j, *((int *)p + i * col + j));//二维数组元素地址连续排列
}
}
}