嗨,我试图理解算法,但是我只是不理解在函数中使用它们。在这种情况下,将向量传递给函数。理解中的主要问题是“ 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] ));
}
答案 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中)