一维数组可以很容易地作为指针传递,但是将二维数组传递给函数的语法可能很难记住。传递多维数组的一个重要事项是,不必指定第一个数组维度。必须给出第二个(以及任何后续)维度
1) 当两个维度都全局可用时(作为宏或全局常量)。
输出
输出
输出
输出
输出
#include <stdio.h>
const int M = 3;
const int N = 3;
void print(int arr[M][N])
{
int i, j;
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
printf("%d ", arr[i][j]);
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(arr);
return 0;
}
1 2 3 4 5 6 7 8 9
2) 当全局只有第二维可用时(作为宏或全局常量)。
#include <stdio.h>
const int N = 3;
void print(int arr[][N], int m)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < N; j++)
printf("%d ", arr[i][j]);
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(arr, 3);
return 0;
}
1 2 3 4 5 6 7 8 9
如果第二维是固定的并且不是用户指定的,则上述方法很好。以下方法处理第二维也可以更改的情况。
3) 如果编译器与 C99 兼容
从 C99 开始,C 语言支持通过指定可变维度简单地传递可变大小的数组
// The following program works only if your compiler is C99 compatible.
#include <stdio.h>
// n must be passed before the 2D array
void print(int m, int n, int arr[][n])
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", arr[i][j]);
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3, n = 3;
print(m, n, arr);
return 0;
}
1 2 3 4 5 6 7 8 9
如果编译器不兼容 C99,那么我们可以使用以下方法之一来传递可变大小的 2D 数组。
4) 使用单个指针
在这种方法中,我们必须在传递给函数时对二维数组进行类型转换。
#include <stdio.h>
void print(int *arr, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3, n = 3;
// We can also use "print(&arr[0][0], m, n);"
print((int *)arr, m, n);
return 0;
}
1 2 3 4 5 6 7 8 9
5) 使用指向数组的指针的概念
#include <stdio.h>
const int M = 3;
void print(int (*arr)[M])
{
int i, j;
for (i = 0; i < M; i++)
for (j = 0; j < M; j++)
printf("%d ", arr[i][j]);
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(arr);
return 0;
}
1 2 3 4 5 6 7 8 9