2011-12-02 116 views
1

我在調用函數無法從int [] []轉換爲int **?

int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}}; 
find_index(matrix); 

和find_index的原型下面的代碼是:

void find_index(int** m); 

,我得到了編譯器錯誤:無法轉換 'INT(*)[3]' 到「 int **'

無論如何,我可以解決這個問題嗎?謝謝!

更新:

是有辦法,我可以然後使用M [A] [B]操作者在第二函數,而不是使所述列數的和做M [A *爲col_num + B]?

+1

其中'矩陣'是指針數組?當然,它們不是兼容的類型...... – tenfour

+1

@tenfour這個混淆顯然來自於你可以傳遞一個int []到一個函數,期望一個int *,而不是int [] []'到一個期望int **的函數。 –

回答

5

雙索引數組仍然只對應於單個指針,而不是指向指針的指針。

+0

是否有一種方法可以在第二個函數中使用m [a] [b]運算符而不是傳遞列號並執行m [a * col_num + b]?謝謝! – Rachel

+0

如果你真的想在函數內使用m [a] [b],你可以聲明它爲find_index(int m [] [3]) – TJD

+0

你絕對不需要傳遞列號。如果你以int *的形式傳遞數組,那麼你只需要瞭解列/行是如何線性佈局的。所以如果你傳遞一個int * m,你會發現m [0] = 1,m [3] = 4,m [6] = 7等。存儲器按照前一行 – TJD

4

在存儲器,int**看起來像

[0] ----> [0] ---> int 
      [1] ---> int 
      [2] ---> int 

[1] ----> [0] ---> int 
      [1] ---> int 
      [2] ---> int 

[2] ----> [0] ---> int 
      [1] ---> int 
      [2] ---> int 

但是一個int[][]看起來像

[0][1][2][0][1][2][0][1][2] 
(0)  (1)  (2) 

所以你可以看到如何檢索它們會導致不同的事情發生(一個指針引用指針,一個執行算術不同),並且它們不兼容。嘗試索引int[][](如int**)會導致您要存儲的整數中的一個被解除引用,從而導致未定義的行爲。

相關問題