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
是虚拟企业