1

我看到,當我試圖找出如何通過指針動態分配的二維陣列功能,這個例子: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

無計算。你的函數「zeroit」通過「double indirection」達到一個整數。

「int ** array」實際上並不是一個整數矩陣。它完全是一個「整數指針指針」 - 更多是整數向量的向量。當訪問「array [i]」(第一個間接尋址)時,你會得到一個「int *」,即整數的第i個向量的地址。當訪問「array [i] [j]」(第二個間接尋址)時,會得到一個「int」,即第i個向量的第j個整數。

0

如果你的「2d數組」實際上只是指向單個行的指針數組,那麼它僅僅通過查詢行的地址然後對其應用偏移量來計算正確的地址。但是,這是實現「二維數組」的非常低效的方式。最好的方法是簡單地使用普通的一維數組,並用乘法和加法來計算索引,但在C99中,您還可以使用vla語義來讓編譯器將它看作一個真正的二維數組。

0

如果考慮內存佈局/以下地址:

array  = |10|11|12| 

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

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

單元10包含一個指向單元20,和電池11包含一個指向30,這就是所謂的雙間接 - array是一個連續的,指向整數數組的指針的字寬序列,不需要計算,只需解除引用兩個指針