2011-05-12 74 views
4

爲什麼在下列情況下指針數組「等價」不起作用?指針和數組

void foo(int** x) { 
    cout << x[0][1]; 
} 

int main() { 
    int a[2][2] = {{1,2},{2,3}}; 
    foo(a); 
} 

謝謝

+6

什麼不行?你得到什麼錯誤信息? – Dani 2011-05-12 20:47:23

+0

可能重複[在C中,是數組指針還是用作指針?](http://stackoverflow.com/questions/4607128/in-c-are-arrays-pointers-or-used-as-pointers) – ildjarn 2011-05-12 20:48:55

+0

指針數組「等價」 – user695652 2011-05-12 20:49:06

回答

11

int **和int [2] [2]的內存模型是不同的。
int a[2][2]被存儲在存儲器中作爲:

&a  : a[0][0] 
&a + 4 : a[0][1] 
&a + 8 : a[1][0] 
&a + 12: a[1][1] 

int** x:在存儲器

&x  : addr1 
&x + 4 : addr2 
addr1 : x[0][0] 
addr1 + 4: x[0][1] 
addr2 : x[1][0] 
addr2 + 4: x[1][1] 

addr1addr2和只是地址。
你只是不能將一個轉換爲另一個。

+1

'&x'將是'int ***'類型的......你的意思是'* x'或'x [INDEX]',其中'x'被解引用給它所指向的(int *)在這種情況下是指向一個「int」類型的數組)? – Jason 2011-05-12 21:24:34

+0

它實際上是x而不是&x,因爲它是另外兩個地址的地址。 – Dani 2011-05-12 23:03:45

4

它不工作,因爲只有多維數組的第一級衰減到指針。試試這個:

#include <iostream> 
using std::cout; 

void foo(int (*x)[2]) { 
    cout << x[0][1]; 
} 

int main() { 
    int a[2][2] = {{1,2},{2,3}}; 
    foo(a); 
} 
0

因爲該類型不是int **。這個權利爲foo功能

foo(int * [2]);

指針類型a不是int **,完全是int * [2] ..