当我试图弄清楚如何将指针传递到动态分配的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;
  }
 }

我尝试了它,它起作用,但我不明白如何。函数如何计算正确的地址?

其他提示

不需要计算。您的功能“零”通过“双间接”到达整数。

“ int ** array”并不是整数的矩阵。它正是“针对整数指针的指针” - 更多的整数向量。在访问“数组[i]”(第一个间接)时,您会得到一个“ int *”,即整数的ITH向量的地址。在访问“数组[i] [j]”(第二间接区)时,您会得到一个“ int”,即ITH向量的jth整数。

如果您的“ 2D数组”实际上只是单个行的一系列指针,那么它仅通过查找行的地址然后对其进行偏移来计算正确的地址。但是,这是实现“ 2D数组”的一种非常低效的方法。最好的方法是简单地使用普通的一维数组,并用乘法和添加来计算索引,但是在C99中,您也可以使用VLA语义来使编译器将其像真实的2D数组一样对待。

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

array     =  |10|11|12|

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

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

单元10包含一个指向单元格20的指针,细胞11包含一个指向30的指针,这称为双间接 - array 是指向INT数组的连续宽度序列,无需计算,只需取消两个指针

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top