有两种主要的方法来完成这一点。
注意:我不确定你的第二个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