向量传递给带有指针参数c ++的函数的麻烦

时间:2014-04-05 06:32:53

标签: c++ function pointers vector

我正在做一个教程给出的练习,他们希望函数上的参数是一个指针?语法与这些概念有点混淆,所以任何清晰度都是好的。我很熟悉它们是如何工作的,所以没有麻烦。

保持转换问题'无法将std :: vector int转换为int *'

请让我知道问题是什么以及可能导致混淆的原因,谢谢。

以下是代码:

void randArrayFill(int* theArray, int aSize)
{
    for (int i = 0; i < aSize; i++)
    {
        *(theArray + 1) = rand() % 101;
    }
}
int main()
{
    int vecSize;
    vector<int> simpleVec;
    cin >> vecSize;
    simpleVec.resize(vecSize);
    randArrayFill(simpleVec, vecSize);


    for (int i = 0; i < vecSize; i++)
    {
        cout << simpleVec[i] << endl;
    }
}

3 个答案:

答案 0 :(得分:1)

虽然可以使用语法&amp; simpleVec [0]将向量作为int *参数传递,但我不建议在您的情况下执行此操作。因为,您正在传递向量&lt;&gt;的内部缓冲区。类,并且绕过类控件更改其内容不是一个好主意。您应该仅将此技术用于读取而不是用于写入操作。因此,我建议您使用以下解决方案之一更改代码:

void randArrayFill(std::vector<int>& theArray)
{
    for (int i = 0; i < theArray.size(); i++)
    {
        theArray[i] = rand() % 101;
    }
}

通过这种方式,您可以传递对向量的引用并在函数内部进行管理而不会出现问题。你的主要应该是:

int main()
{
    int vecSize;
    vector<int> simpleVec;
    cin >> vecSize;
    simpleVec.resize(vecSize);
    randArrayFill(simpleVec);

    for (int i = 0; i < theArray.size(); i++)
    {
        cout << simpleVec[i] << endl;
    }
}

如果您需要了解指针并且不想更改功能声明,可以按照以下步骤更改主要内容:

int main()
{
    int vecSize;
    int *simpleVec;
    cin >> vecSize;

    simpleVec = new int[vecSize]; // allocate memory for your vector

    randArrayFill(simpleVec, vecSize);


    for (int i = 0; i < vecSize; i++)
    {
        cout << simpleVec[i] << endl;
    }

    delete[] simpleVec; 
}

答案 1 :(得分:0)

你想要的是进入向量的内部缓冲区并传递一个指向这个实体的指针。要到达内部缓冲区,请传递向量的第一个元素的地址。

  randArrayFill(&simpleVec[0], vecSize);

由于向量的内部缓冲区是在连续的内存中布局的,所以你在这里很好。另请注意,如果simpleVec是常规数组,那么相同的语法就会起作用,所以如果由于某种原因你决定使用数组而不是向量,你真的不必更改代码。

需要注意的是,您必须确保向量不为空,因为获取元素0的地址会导致未定义的行为。

答案 2 :(得分:0)

你可以用这种方式做同样的事情。

void randArrayFill(vector<int>& theArray, int aSize)
{
   for (int i = 0; i < aSize; i++)
   {
       theArray[i] = rand() % 101;
   }
   return ;
}

int main()
{
   int vecSize;
   vector<int> simpleVec;
   cin >> vecSize;
   simpleVec.resize(vecSize);
   randArrayFill(simpleVec, vecSize);
   for (int i = 0; i < vecSize; i++)
   {
       cout << simpleVec[i] << endl;
   }
    return 0;
}