2012-08-29 132 views
0

我有兩個在運行時創建的整數數組(大小取決於程序輸入)。在某些時候,我需要用一個數組的內容來更新數組的內容,並進行一些計算。是否可以將指針傳遞給數組並將其作爲函數參數傳遞?

首先,我想過將這些數組作爲參數傳遞給一個函數,因爲我沒有找到一種方法來在C中返回函數(不要認爲這是可能的)。意識到這是一個壞主意,因爲參數不能真正修改,因爲它們被複制到堆棧上,我改用數組指針來代替。

雖然功能仍然是空的,這是我的代碼:

1日起飛(代碼編譯,沒有錯誤):

// Elements is just to be able to iterate through their contents (same for both): 
void do_stuff(int first[], int second[], int elements) {} 

// Call to the function: 
do_stuff(first, second, elements); 

2日起飛,企圖轉換爲指針能夠修改陣列到位:

void do_stuff(int *first[], int *second[], int elements) {} 

// Call to the function: 
do_stuff(&first, &second, elements); 

這個代碼導致一些應有的編譯時錯誤,因爲很明顯我認爲是指向數組是指針數組。

3取,我覺得這是正確的語法:

void do_stuff(int (*first)[], int (*second)[], int elements) {} 

// Call to the function: 
do_stuff(&first, &second, elements); 

不過此代碼生成試圖訪問陣列(例如*first[0])的元素時,編譯時錯誤:

error: invalid use of array with unspecified bounds 

所以我的問題是關於使用數組指針作爲函數的參數的可能性,有可能嗎?如果是這樣,那該怎麼辦?

無論如何,如果您想在執行包含第二個內容的計算後更新第一個數組的更好方法,請對其進行評論。

+0

當您將一個數組作爲函數參數傳遞時,實際上您將一個指針傳遞給第一個元素,因此您可以使用該指針從函數修改數組。 –

回答

2

數組衰減爲指向爲數組分配的數據的指針。傳遞給函數時,數組不會被複制到堆棧。因此,你不需要傳遞一個指向數組的指針。所以,下面應該可以正常工作。

// Elements is just to be able to iterate through their contents (same for both): 
void do_stuff(int first[], int second[], int elements) {} 

// Call to the function: 
do_stuff(first, second, elements); 

你的錯誤在您的第二次嘗試的原因是因爲int *first[](以及其他類似的)是類型數組指針的實際爲int

第三錯誤的原因是因爲*first[N]實際上是*(first[N]),不能輕鬆完成。數組訪問實際上是指針算術的正面,*(first + sizeof first[0] * N);但是,這裏有一個不完整的元素類型 - 您需要指定數組的大小,否則sizeof first[0]未知。

1

你的第一次嘗試是正確的。當在C中傳遞一個數組作爲參數時,實際上會傳遞一個指向第一個元素的指針,而不是數組的副本。所以,你可以寫任何

void do_stuff(int first[], int second[], int elements) {} 

喜歡你了,或者

void do_stuff(int *first, int *second, int elements) {} 
0

在C數組自動衰減到指針數據,所以,你可以只通過陣列和它們的長度,並得到想要的結果。

我的建議是這樣的:

void dostuff(int *first, int firstlen, int *second, int secondlen, int elements) 

函數調用應該是:

do_stuff(first, firstlen, second, secondlen, elements); 

我不是很清楚你的問題,你爲什麼需要elements。但是,您必須傳遞數組長度,因爲數組在傳遞給函數時自動衰減爲指針,但在被調用的函數中,無法確定它們的大小。

+0

'elements'指定了數組的長度,我意識到'length'更清晰了;謝謝。 –