有兩種主要的方法來完成這一點。
注意:我不確定你的第二個for循環在做什麼。我猜想的目的是確保數字都是獨一無二的?你可能想看看它,因爲它不是它在做什麼。 爲了這個問題的目的,我把它簡化爲只生成隨機數來填充數組。
第一是把你的代碼,並修復它把生成的數字放入數組中傳遞:
#include <iostream>
void getLotto(int numbers[7]) {
for (int i = 0; i < 7; i++)
{numbers[i] = rand() % 35 + 1;}
return;
}
int main()
{
srand(time(0));
int lotto_numbers[7];
getLotto(lotto_numbers);
for (int i = 0; i < 7; i++)
{std::cout<<lotto_numbers[i]<<std::endl;}
}
numbers
實際上不傳遞作爲int[]
而是作爲一個int*
指點到陣列。這意味着您對該功能所做的任何更改都會在原始數據中發生更改。
記住,你需要保持跟蹤你的數組越界的現象,因爲陣列可以被定義爲
int lotto_numbers[6]
這意味着
numbers[7]
將出界。第二種方法是在堆上創建數組。這意味着你不需要傳入一個數組,但是你可以在函數中實例化它
我實際上不打算在這裏提供代碼。主要是因爲這樣簡單的事情,內存管理比它的價值更麻煩。 (你需要記住在堆上創建的所有東西都需要調用delete[]
)。
相反,讓使用內存管理的東西建於:
#include <iostream>
#include <vector>
std::vector<int> getLotto() {
std::vector<int> numbers;
numbers.reserve(7);
for (int i = 0; i < 7; i++) {
//numbers[i] = rand() % 35 + 1;
//would work, but is unsafe as you could potentially reference somthing out of range
//this is safer:
numbers.push_back(rand() % 35 + 1);
}
return numbers;
}
int main()
{
srand(time(0));
std::vector<int> lotto_numbers = getLotto();
for (auto i = lotto_numbers.begin(); i != lotto_numbers.end(); i++)
{
std::cout<<*i<<std::endl;
}
}
矢量處理內存管理你。向量可以被返回,並且返回的向量將仍然指向我們剛纔填充的堆上的已分配內存。我們不需要釋放它,因爲這將在向量超出範圍時自動完成。
難道你不應該填寫rad而不是數字嗎?目前它未被使用。那麼你不需要返回任何東西。 – deviantfan 2014-10-09 00:36:09
@deviantfan如果rad通過引用傳遞,那麼這不僅僅是真的嗎? – Shadow 2014-10-09 00:37:47
數組永遠不會傳值,只是指向數組的指針。 – Galik 2014-10-09 00:39:44