假設我有一個函數int function(int N, int c[N]){...}
,它將整數和數組作爲參數。假設現在我有一個大小爲'N倍2'的雙數組**c
,並且假設我想將函數function
應用於雙箭頭c[i][0]
,i
中的一列,從N到1變化。我該如何使用這個功能。它看起來像function(N,*c[0])
?如何將1D和2D數組參數傳遞給函數c
有沒有人可以幫忙?
假設我有一個函數int function(int N, int c[N]){...}
,它將整數和數組作爲參數。假設現在我有一個大小爲'N倍2'的雙數組**c
,並且假設我想將函數function
應用於雙箭頭c[i][0]
,i
中的一列,從N到1變化。我該如何使用這個功能。它看起來像function(N,*c[0])
?如何將1D和2D數組參數傳遞給函數c
有沒有人可以幫忙?
用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);
可用於動態分配的二維數組。
哇,真的有趣,謝謝! – user1611830
在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
{
}
謝謝有趣! – user1611830
你是對的,你不必在第一維中提及'N',但它可以被視爲是顯示代碼意圖的良好實踐。對於固定大小,還有符號'int x [static 10]',它要求通過指針傳遞的數組至少有10個元素。 –
好的,事實上我做的沒有工作。如果我以下面的例子爲例,假設我調用函數'function':void function(int rows,int x [] [5]),假設我稍後在我的代碼中調用這個函數,在函數中(rows,x ),其中x是您提到的2D arry,它不起作用.... – user1611830
當你寫「雙數組」我認爲你的意思是「二維數組」。雙數組是完全不同的東西。 –
對不起,我認爲這是正確的。我的意思是二維數組 – user1611830
你應該明確地讀到C中的指針和數組。一個二維數組和一個指向指針的指針(你的** c')完全不同的野獸並且不兼容。 –