这篇文章是对如何在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)。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。
推荐阅读
- CSS边框样式使用详细介绍
- Javascript短路运算符
- win8系统的常用快捷键总结
- win8系统硬盘分区的图文步骤
- Win8开机自动重启3大处理办法
- windows8系统安装Dreamweaver CS6失败的处理办法
- Win8系统如何清理c盘空间?
- Win8.1安装失败提示无法打开install.wim处理办法
- win8如何安装IE12?windows 8.1安装IE12的图文步骤