C在函数中如何知道2D动态数组的尺寸?
-
30-09-2019 - |
题
当我试图弄清楚如何将指针传递到动态分配的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数组的连续宽度序列,无需计算,只需取消两个指针
不隶属于 StackOverflow