将矢量传递到具有指针参数 C++ 的函数中的问题

troubles with vector being passed into a function with pointer parameters c++

本文关键字:C++ 参数 函数 问题 指针      更新时间:2023-10-16

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

保持有转换问题"无法将 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;
    }
}

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

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;
    }
}

如果您需要了解指针并且不想更改函数声明,则可以按如下方式更改 main:

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; 
}
你想要的是

进入向量的内部缓冲区并传递指向此实体的指针。 若要访问内部缓冲区,请传递向量的第一个元素的地址。

  randArrayFill(&simpleVec[0], vecSize);

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

需要注意的是,您必须确保向量不为空,因为获取元素 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;
}