2013-05-29 151 views
3

我一直在閱讀這question,但我無法得到結果代碼來解決問題。 我應該如何改變它以使其工作?傳遞到函數的二維數組

void print2(int ** array,int n, int m); 

main() 
{ 
    int array[][4]={{1,2,3,4},{5,6,7,8}}; 
    int array2[][2]={{1,2},{3,4},{5,6},{7,8}}; 
    print2(array,2,4); 
} 

void print2(int ** array,int n,int m) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
     printf("%d ",array[i][j]); 

     printf("\n"); 
    } 
} 
+2

你是什麼意思**「我不能得到最終的代碼來解決問題」**? –

+0

編譯器無法編譯該程序..出現以下錯誤:'警告:從不兼容的指針類型傳遞print2的arg 1' 我不明白上一個問題中給出的解決方案:s –

回答

5

你正在傳遞一個指向數組的指針,但你的函數需要一個指向指針的指針。 在C中,數組名稱衰減到一個值,該值是指向第一個數組元素的指針。在這種情況下,第一個數組元素是一個數組,因此函數參數衰減爲指向數組的指針。

這裏有一種方法可以解決這個問題。更改函數採取void *,以便維度不干涉參數。然後,在函數體中使用dimension參數爲2D數組創建適當的指針類型。

void print2(void *p,int n,int m) 
{ 
    int i,j; 
    int (*array)[m] = p; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
      printf("%d ",array[i][j]); 
     printf("\n"); 
    } 
} 

如果你願意改變的參數的順序,那麼你可以使用數組參數的正確類型:

void print2(int n, int m, int array[n][m]) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
      printf("%d ",array[i][j]); 
     printf("\n"); 
    } 
} 

由於傑克問C89,這裏有一個方法來處理它。由於2D數組的組織方式與內存中的長1D數組相同,因此您可以像傳入的指針那樣行走。再次,我們接受輸入參數作爲void *以避免處理衰減類型。然後,我們把指針作爲一項長期的維數組,但我們根據適當的尺寸走走吧:

void print2(void *p, int n, int m) 
{ 
    int i,j; 
    int *array = p; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
      printf("%d ",array[i*m+j]); 
     printf("\n"); 
    } 
} 
+0

這是最後一個' print2()'函數在C89中有效嗎? – Jack

+0

@Jack:我的答案都依賴於可變長度數組。這兩個都不適用於C89。 – jxh

+0

正如我所想象的那樣。謝謝@ user315052 – Jack

0

在你的問題你逝去的參數作爲指向數組的指針。 做如下給出:

void print2(int (*array)[4],int n,int m) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
     printf("%d ",array[i][j]); 

     printf("\n"); 
    } 
}