当我试图弄清楚如何将指向动态分配的二维数组的指针传递给函数时,我看到了这个例子:
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”如何计算正确的地址?
当我试图弄清楚如何将指向动态分配的二维数组的指针传递给函数时,我看到了这个例子:
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”如何计算正确的地址?
你在这里:
http:
//www.eskimo.com/~scs/cclass/int/sx9a.html
http://www.eskimo.com/~scs/cclass/int/sx9b.html
无需计算。您的函数“zeroit”通过“双重间接”达到一个整数。
“int **array”并不是真正的整数矩阵。它完全是“整数指针上的指针” - 更多的是整数向量的向量。当访问“array[i]”(第一次间接)时,您会得到一个“int *”,即第 i 个整数向量的地址。访问“array[i][j]”(第二次间接)时,您会得到一个“int”,即第 i 个向量的第 j 个整数。
如果您的“二维数组”实际上只是一个指向各个行的指针数组,那么它仅通过查找行的地址然后对其应用偏移量来计算正确的地址。但是,这是实现“二维数组”的一种非常低效的方法。最好的方法是简单地使用普通的一维数组并通过乘法和加法自己计算索引,但在 C99 中,您也可以使用 vla 语义让编译器将其视为真正的二维数组。
如果您考虑以下内存布局/地址:
array = |10|11|12|
array[0] = |20|21|22|
array[1] = |30|31|32|
单元格 10 包含指向单元格 20 的指针,单元格 11 包含指向单元格 30 的指针,这称为双向间接 -array
是指向整数数组的指针的连续字宽序列,无需计算,只需取消引用两个指针