C++ 从函数返回向量指针

C++ 从函数返回向量指针,c++,algorithm,vector,parameter-passing,C++,Algorithm,Vector,Parameter Passing,嗨,我试图理解算法,但我不明白如何在函数中使用它们。在这种情况下,将向量传递给函数。理解中的主要问题是“string*ptrToElement(vector*constpvec,inti)”的返回部分。。我不知道为什么在这个函数中返回时,“return(&((*pVec)[I])”,为什么pVec有一个*。为什么它是指针。这就是困扰我理解的原因,我不明白为什么pvec string* ptrToElement(vector<string>* const pVec, int i); i

嗨,我试图理解算法,但我不明白如何在函数中使用它们。在这种情况下,将向量传递给函数。理解中的主要问题是“
string*ptrToElement(vector*constpvec,inti)”的返回部分。
。我不知道为什么在这个函数中返回时,
“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] ));
    }
string*ptr元素(向量*const-pVec,int-i);
int main()
{
病媒向量表;
把你推回(“剑”);
Vec。推回(“盾牌”);
Vec。推回(“盔甲”);

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


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

所指向的字符串向量中,正如Igor Tandetnik所指出的,代码没有多大意义


pVec
是指向字符串向量的指针,
*pVec
给出它所指向的向量。然后,
[i]
给出向量中索引的字符串
i
,最后,
&
给出一个指向字符串的指针。因此,此函数返回一个指向
i
的元素的指针,该元素位于由
pVec
指向的字符串向量中。费翔已经给出了很好的解释。我想添加一个关于
*

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

  • vector*
    ,这表示指向向量对象的指针。
    *
    是该类型的一部分
  • (*pVec)
    *
    这里是将指针解引用到它的指针对象中。解引用的目的是使用向量的
    操作符[]
    访问向量元素。您可以直接使用指针来做这件事,代码看起来像
    pVec->操作符[](i)

费翔已经给出了很好的解释。我想补充一个关于
*
的解释

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

  • vector*
    ,这表示指向向量对象的指针。
    *
    是该类型的一部分
  • (*pVec)
    *
    这里是将指针解引用到它的指针对象中。解引用的目的是使用向量的
    操作符[]
    访问向量元素。您可以直接使用指针来做这件事,代码看起来像
    pVec->操作符[](i)

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

编译器和程序加载器将拾取实际内存地址,并且这些位置可能会在每次程序运行时更改,因此我们将仅编一些值以供演示

vecInventory
是一个向量对象,它占用一些内存,因为它里面有一些数据,所以为了演示起见,让我们说它存储在内存中,从地址100开始。如果在程序中写入
vecInventory
,它指的是向量对象

&vecInventory
是向量对象的地址。因此
&vecInventory
只是数字100,因为这是向量对象的内存位置

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

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

您可以直接将
vecInventory
向量对象传递给
ptrToElement
,而不是传递向量对象的内存位置,但将值传递给函数意味着复制传递的值。因此,如果传递数字(如内存位置)只复制一个数字,而如果一个对象非常大,则直接传递该对象可能是一个问题,因为复制一个非常大的对象可能需要一段时间。在这种情况下,这并不重要,因为向量很小(放入向量中的数据不存储在向量对象中)

(*pVec)[i]
是存储在向量条目的i处的值。记得我说过输入向量的数据不存储在向量对象中吗?因此,在您的示例中,当i=0时,为了演示的目的,让我们说向量的索引0处的值存储在从地址50开始的内存中

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

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

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

  • vecInventory
    是向量对象(存储在内存位置100)
  • 是内存位置100
  • pVec
    是内存位置100
  • *pVec
    是虚拟企业