簡體   English   中英

C如何知道函數中2D動態數組的維數?

[英]how does C know dimensions of 2d dynamic array in a function?

當我試圖弄清楚如何將指向動態分配的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”如何計算正確的地址?

無需計算。 您的函數“ zeroit”通過“雙重間接”達到整數。

“ int ** array”實際上不是整數矩陣。 它恰好是“整數指針的指針”-更多是整數的向量。 當訪問“ array [i]”(第一個間接尋址)時,您將獲得“ int *”,即第i個整數向量的地址。 當訪問“ array [i] [j]”(第二種間接方式)時,您將獲得“ int”,即第i個向量的第j個整數。

如果您的“ 2d數組”實際上只是指向各個行的指針的數組,則僅通過查找行的地址然后對其施加偏移量即可計算出正確的地址。 但是,這是實現“ 2d數組”的非常無效的方法。 最好的方法是簡單地使用普通的一維數組並通過乘法和加法自己計算索引,但是在C99中,您還可以使用vla語義使編譯器將其視為真實的2d數組。

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

array     =  |10|11|12|

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

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

單元10包含一個指針到單元20,以及電池11包含一個指向30,這就是所謂的雙間接- array是指向整數的陣列的順序的,字寬序列,也沒有必要計算,只需解除引用兩個指針

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM