从函数返回向量指针

时间:2018-07-05 03:41:40

标签: c++ algorithm vector parameter-passing

嗨,我试图理解算法,但是我只是不理解在函数中使用它们。在这种情况下,将向量传递给函数。理解中的主要问题是“ string* ptrToElement(vector<string>* const pVec, int i)"的返回部分。我不知道为什么在返回"return (&( (*pVec)[i] ))"的此函数中,为什么pvec具有*。为什么它是指针。是什么让我难以理解,我明白了为什么PVEC拥有

string* ptrToElement(vector<string>* const pVec, int i);
int main()
{

vector<string> vecInventory;

vecInventory.push_back("sword");
vecInventory.push_back("shield");
vecInventory.push_back("armour");

cout << "Sending the object pointed to by returned pointer: " << endl;
cout << *( ptrToElement(&vecInventory,0) ) << endl << endl;


int iTemp = 0;
cin >> iTemp;
return (0);
}



string* ptrToElement(vector<string>* const pVec, int i)
    {
    return (&( (*pVec)[i] ));
    }

3 个答案:

答案 0 :(得分:2)

费翔给出了一个很好的解释。我想添加有关*的说明。

在您的代码中,*有两种不同的含义,我认为这可能是您不太了解它的原因之一。

  • vector<string>*,这意味着指向矢量对象的指针。 *是该类型的一部分。
  • (*pVec)*在这里将指针取消引用到其指针。取消引用的目的是使用向量的operator []访问向量元素。您可以使用指针直接执行操作,代码看起来像pVec->operator[](i)

答案 1 :(得分:1)

正如Igor Tandetnik所指出的那样,代码没有多大意义。

pVec是一个指向字符串向量的指针,*pVec给出了它指向的向量。然后,[i]给出在向量内索引为i的字符串,最后,&给出指向该字符串的指针。因此,此函数返回指向i指向的字符串向量内索引为pVec的元素的指针。

答案 2 :(得分:1)

要了解这一点,您只需要可视化变量和指针在内存位置方面的实际含义即可。

编译器和程序加载器将选择实际的内存地址,并且每次运行程序时这些位置可能会更改,因此我们仅出于演示目的而组成一些值。

vecInventory是一个向量对象,由于其中包含一些数据,因此会占用一些内存,因此为了说明起见,我们将其存储在从地址100开始的内存中。如果您编写{{1} }在程序中是指矢量对象。

vecInventory是矢量对象的地址。 &vecInventory就是数字100,因为那是矢量对象的存储位置。

因此,现在当您将&vecInventory传递给&vecInventory时,该函数将接收值100,该值存储在ptrToElement中。因此pVec包含数字100。

pVec表示存储在指针中存储位置的事物。 *pVec包含值100,它是矢量对象的存储位置,因此pVec是矢量对象。

您可能刚刚将*pVec向量对象直接传递给vecInventory而不是传递向量对象的存储位置,但是将值传递给函数意味着复制传递的值。因此,如果您传递一个数字(例如存储位置),则仅复制一个数字,而如果该对象确实很大,则直接传递对象可能会成为问题,因为复制非常大的对象可能需要一段时间。在这种情况下,因为向量很小(您放入向量中的数据不会存储在向量对象中)就没有关系。

ptrToElement是存储在向量入口i处的值。还记得我说过您放入向量中的数据没有存储在向量对象中吗?因此,在您的示例中,当i = 0时,出于演示目的,我们可以将向量索引0的值存储在从地址50开始的内存中。

(*pVec)[i],当i = 0时是数字50,因为这是索引0的值存储在内存中的位置。这意味着从&(*pVec)[i]返回的值是数字50。

ptrToElement(&vecInventory,0)表示存储在指针中存储位置的事物。 *( ptrToElement(&vecInventory,0) )返回值50,它是存储在索引0处的值的存储位置,因此ptrToElement(&vecInventory,0)是存储在矢量对象的索引0处的值。

因此在我们的示例演示中:

  • *( ptrToElement(&vecInventory,0) )是矢量对象(存储在内存位置100中)
  • vecInventory是存储位置100
  • &vecInventory是存储位置100
  • pVec是矢量对象(存储在内存位置100中)
  • *pVec,当i = 0是向量的索引0处的值(存储在存储位置50处)
  • (*pVec)[i]是存储位置50
  • &(*pVec)[i]是存储位置50
  • ptrToElement(&vecInventory,0)是向量的索引0处的值(存储在存储位置50中)