如何在C中将2D数组作为参数传递()

这篇文章是对如何在C中动态分配2D数组?
一维数组可以很容易地作为指针传递, 但是将2D数组传递给函数的语法可能很难记住。传递多维数组的重要一件事是, 不必指定第一个数组维。必须提供第二个(以及任何后续)尺寸
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

【如何在C中将2D数组作为参数传递()】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; }

在C99兼容编译器上的输出:
1 2 3 4 5 6 7 8 9

如果编译器不兼容C99, 则可以使用以下方法之一传递可变大小的2D数组。
4)使用单个指针
在此方法中, 传递给函数时, 我们必须对2D数组进行类型转换。
#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

参考文献:
http://www.eskimo.com/~scs/cclass/int/sx9a.html
本文作者:阿比·拉西(Abhay Rathi)。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。

    推荐阅读