C如何知道函数中2D动态数组的维数?

问题描述:

我看到,当我试图找出如何通过指针动态分配的二维阵列功能,这个例子:C如何知道函数中2D动态数组的维数?

void zeroit(int **array, int nrows, int ncolumns) 
{ 
int i, j; 
for(i = 0; i < nrows; i++) 
    { 
    for(j = 0; j < ncolumns; j++) 
    array[i][j] = 0; 
    } 
} 

我想它和它的作品,但我不知道怎么样。函数“zeroit”如何计算正确的地址?

+0

如何将您传递给数组的值定义为? – 2010-10-15 06:24:02

+0

只有第二个链接与问题真的有关,但+1通过链接而不是我自己做的DIY图来打我 – tobyodavies 2010-10-15 06:28:32

+0

我现在看到它,它不必知道动态数组的本质。谢谢! – yam 2010-10-15 06:32:18

无计算。你的函数“zeroit”通过“double indirection”达到一个整数。

“int ** array”实际上并不是一个整数矩阵。它完全是一个“整数指针指针” - 更多是整数向量的向量。当访问“array [i]”(第一个间接寻址)时,你会得到一个“int *”,即整数的第i个向量的地址。当访问“array [i] [j]”(第二个间接寻址)时,会得到一个“int”,即第i个向量的第j个整数。

如果你的“2d数组”实际上只是指向单个行的指针数组,那么它仅仅通过查询行的地址然后对其应用偏移量来计算正确的地址。但是,这是实现“二维数组”的非常低效的方式。最好的方法是简单地使用普通的一维数组,并用乘法和加法来计算索引,但在C99中,您还可以使用vla语义来让编译器将它看作一个真正的二维数组。

如果考虑内存布局/以下地址:

array  = |10|11|12| 

array[0] = |20|21|22| 

array[1] = |30|31|32| 

单元10包含一个指向单元20,和电池11包含一个指向30,这就是所谓的双间接 - array是一个连续的,指向整数数组的指针的字宽序列,不需要计算,只需解除引用两个指针