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

时间:2010-10-15 06:19:38

标签: c pointers function multidimensional-array dynamic-allocation

当我试图弄清楚如何将指向动态分配的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”如何计算正确的地址?

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

无需计算。您的函数“zeroit”通过“double indirection”达到整数。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果你考虑下面的内存布局/地址:

array     =  |10|11|12|

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

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

单元格10包含指向单元格20的指针,单元格11包含指向30的指针,这称为双间接指向 - array是指向int数组的指针的顺序字宽序列,没有必要计算,只需取消引用两个指针