2011-12-02 115 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**)会导致您要存储的整数中的一个被解除引用,从而导致未定义的行为。

相关问题