2012-08-25 63 views
0

假設我有一個函數int function(int N, int c[N]){...},它將整數和數組作爲參數。假設現在我有一個大小爲'N倍2'的雙數組**c,並且假設我想將函數function應用於雙箭頭c[i][0],i中的一列,從N到1變化。我該如何使用這個功能。它看起來像function(N,*c[0])如何將1D和2D數組參數傳遞給函數c

有沒有人可以幫忙?

+0

當你寫「雙數組」我認爲你的意思是「二維數組」。雙數組是完全不同的東西。 –

+0

對不起,我認爲這是正確的。我的意思是二維數組 – user1611830

+0

你應該明確地讀到C中的指針和數組。一個二維數組和一個指向指針的指針(你的** c')完全不同的野獸並且不兼容。 –

回答

1

用C數組時傳遞給函數總是衰減到指針到它的第一個元素。這在某些情況下很好知道。

舉個例子,你可以寫

int list[10]; 
func (int *x) { 
    int i; 
    for (i = 0; i < 10; i++) { 
     printf("%d", x[i]); 
    } 
} 

X [i]實際上只是語法糖。在C中,使用括號表示法訪問數組的元素時,它將轉換爲*(x + i),其中x是數組的名稱。

這是因爲指針算術。如果x是10個整數數組的名稱,則表達式中x的值是該數組的第一個整數的地址。我會一直指向x之後的第i個元素(C考慮到存儲在數組中的元素類型的大小,並相應地增加指針)。

因此,當傳遞2d數組時,數組衰減爲指向其第一個元素的指針 - 這是一個數組。

採取二維數組的函數簽名可以被寫爲

func(int x[][columns] { 
     ... 
} 
// but could also be written as 

func(int (*x)[columns]) { 
    ... 
} 

這表明x是指向整數數組。

有時您需要編寫一個函數來接受一個2維數組,其寬度在運行時間之前是未知的。在這種情況下,您可以將指針傳遞給[0] [0]元素並傳遞這兩個維度,然後使用指針算術獲取正確的元素。例如,

print_2d_array (int *x, height, width) { 
    int i, j; 
     for (i = 0; i < height; i++) { 
     for (j = 0; j < width; j++) { 
      printf("%d", x[i * width + j]); 
     } 
    } 
} 

int list[10][10]; 
print_2d_array (&list[0][0], 10, 10); 

可用於動態分配的二維數組。

+0

哇,真的有趣,謝謝! – user1611830

2

在c語言中,對於單維數組,您不需要在將數組傳遞給該函數時在函數參數中提及數組的大小。

如果它是一個單維陣列

... 
int a[10]; 
func(10, a); 
... 
void func(int size, int x[]) //no need to mention like int x[10] 
{ 
    //here x is not an array. Its equivalent to int * 
    printf("%d", sizeof(x)); // this will print 4 or 8 not 40 
} 

如果是2D陣列

... 
int a[10][5]; 
func (10, a); 
... 

void (int rows, int x[][5]) //here int x[][] is invalid 
{ 

} 
+0

謝謝有趣! – user1611830

+0

你是對的,你不必在第一維中提及'N',但它可以被視爲是顯示代碼意圖的良好實踐。對於固定大小,還有符號'int x [static 10]',它要求通過指針傳遞的數組至少有10個元素。 –

+0

好的,事實上我做的沒有工作。如果我以下面的例子爲例,假設我調用函數'function':void function(int rows,int x [] [5]),假設我稍後在我的代碼中調用這個函數,在函數中(rows,x ),其中x是您提到的2D arry,它不起作用.... – user1611830