2011-09-06 39 views
1

修改後的數組的編譯器顯示:我試圖使二維數組,把它傳遞給函數,然後更新主

Warning: passing argument 1 of 'fun' from incompatible 
pointer type; note: expected 'int()[5]' but argument 
is of type 'int (*)[5][5]' 

代碼:

#include<stdio.h> 

void fun(int * b[][5]) 
{ 

    int x=11,y=90; 
    printf("here"); 
    *b[1][3] = x; 
    *b[3][1] = y; 
    *b[2][2] = x + ++y; 
} 

int main() 
{ 

    int a[5][5]; 
    a[1][3] = 12; 
    a[3][1] = 145; 
    fun(&a); 

    printf("%d %d %d",a[1][3],a[3][1],a[2][2]); 
} 
+1

將有助於... –

+2

也會有所幫助,如果你包括一個實際的問題。 –

回答

3

你不需要星號在你的函數參數中,並且你不需要在函數中取消引用數組b。數組是通過引用傳遞的(所以也要去掉foo中的&符號(&a)),因爲C將它們視爲指向序列中第一個元素的指針。多維數組被視爲指向較小子數組(即數組數組)的指針數組。與上面相同的解釋適用。

您的代碼應該是這樣的結尾:

void fun(int b[][5]) // can also be (int (*b)[5]), i.e. array of 5 pointers 
{ 
    int x=11,y=90; 
    b[1][3] = x; 
    b[3][1] = y; 
    b[2][2] = x + ++y; 
} 

int main() 
{ // ... 
    fun(a); 
    // ... 
} 
+2

-1直到你刪除褻瀆「數組是指針」...! –

+0

固定。我認爲它會更有意義,儘管它是錯誤的:P – evgeny

+0

刪除了-1。然而,「數組通過引用傳遞」並不能真實地告訴整個圖片。 –

2
int a[5][5]; //is an 2d int array 

當數組傳遞給函數,真正被傳遞是一個指向數組第一個元素。

所以調用fun()函數fun(a)實際上將指針傳遞到a第一元件,在這種情況下尺寸5.功能fun()的int數組將接收一個指向大小爲5的int數組,即比如int (*b)[5]。請注意,int *b[5]不相同,並且是包含int指針的大小爲5的數組。

fun功能既可以有:

void fun(int b[][5]) 

void fun(int (*b)[5]) 

做它說,該函數將接受整型的二維數組的第一種方式,但因爲我們知道什麼實際上將被髮送到的函數是一個指向數組第一個元素的指針a,編譯器會靜靜地編譯該函數,就好像該參數是一個指針一樣,因爲它是一個指針,它將接收它。

做明確的第二種方式顯示了鍵入它會接收一個指向數組的大小,如果你有相關的語言標記您的問題5.

+0

+1:這是迄今爲止最準確的答案。我唯一的問題是「第一種方式表示函數將接收2d數組」。它並沒有說,它只是表面上看起來像它。 –

+0

感謝大家,現在我明白了,真的幫助了:) –

相關問題