我有一個基於用戶輸入動態創建的數組,我需要將該數組傳遞給一個函數,在該函數中它將被操作並將結果傳遞迴原始數組。當我嘗試使用如何將一個只在運行時知道大小的數組的引用作爲函數參數傳遞?
void MyFunction(int (&MyArray)[])
我的編譯器抱怨說它不知道數組有多大。
我有一個基於用戶輸入動態創建的數組,我需要將該數組傳遞給一個函數,在該函數中它將被操作並將結果傳遞迴原始數組。當我嘗試使用如何將一個只在運行時知道大小的數組的引用作爲函數參數傳遞?
void MyFunction(int (&MyArray)[])
我的編譯器抱怨說它不知道數組有多大。
你不能。不過你可以使用std::vector
。
你可以給一個指向數組的第一個元素的指針+一個保存數組大小的第二個參數。
如果它只是一個數組,爲什麼不傳遞數組本身和它的大小作爲第二個參數? (通過將數組作爲int*
或int[]
,就C++而言是同樣的東西)。 因爲包含數組的變量的值只是指向數組的第一個元素的指針,所以最終不會通過複製數組的內容來終止運行時,而只是一個儘可能小的指針得到這種情況。
void MyFunction(int MyArray[], int size) { /* edit the array */ }
int main() {
// read nrElements
// ...
// create the array
int *a = new int[nrElements];
// populate it with data
// ...
// and then
MyFunction(a, nrElements);
}
您應該使用std::vector
只有當你想調整在你的函數的陣列(例如增加新的元素的話),但除此之外,你可以堅持這種方法,因爲它的速度更快。
順便說一句,你需要一個數組的引用的唯一情況是,如果你想改變你調用該函數時傳入的變量的值,就像使它指向一個不同的數組。像在:
void createMyArray(int* &array, int nrElements) {
array = new int[nrElements];
for (int i = 0; i < nrElements; ++i) {
array[i] = 0;
}
}
int *a = (int []) {1, 2, 3};
std::cout << a[0] << std::endl; // prints 1
createMyArray(a, 10);
// now a points to the first element of a 10-element array
std::cout << a[0] << std::endl; // prints 0
但你說數組已經創建之前提供給它的功能,沒有意義的使用引用。
當您希望內存分配是確定性的時,您也可以使用在堆棧上分配的std :: vector。 – Nick 2011-03-01 16:02:38