这篇文章是如何在C中动态分配2D数组的扩展。
一维数组可以很容易地作为指针传递,但是将2D数组传递给函数的语法可能很难记住。传递多维数组的重要一件事是,不必指定第一个数组维。必须提供第二个(以及任何后续)尺寸
1)当两个维度都全局可用时(作为宏或全局常量)。
#include
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
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
// 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
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
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。