[英]returning a vector pointer from a function
嗨,我試圖理解算法,但是我只是不理解在函數中使用它們。 在這種情況下,將向量傳遞給函數。 理解中的主要問題是“ 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] ));
}
費翔給出了很好的解釋。 我想對*
添加一個解釋。
在您的代碼中, *
有兩種不同的含義,我認為這可能是您不太了解它的原因之一。
vector<string>*
,這意味着指向矢量對象的指針。 *
是類型的一部分。 (*pVec)
。 *
這是將指針取消引用到其指針。 這里取消引用的目的是使用vector的operator []
訪問vector元素。 您可以使用指針直接執行此操作,代碼類似於pVec->operator[](i)
。 正如Igor Tandetnik指出的那樣,代碼沒有多大意義。
pVec
是指向字符串向量的指針, *pVec
給出它指向的向量。 然后, [i]
給出在向量內索引為i
的字符串,最后, &
給出指向該字符串的指針。 因此,此函數返回指向pVec
指向的字符串向量中索引為i
的元素的指針。
為了理解這一點,您只需要可視化變量和指針在內存位置方面的實際含義。
編譯器和程序加載器將選擇實際的內存地址,並且每次運行程序時這些位置可能會更改,因此我們僅出於演示目的而組成一些值。
vecInventory
是一個向量對象,由於其中包含一些數據,因此會占用一些內存,因此為了說明起見,我們將其存儲在地址為100的內存中。如果在程序中編寫vecInventory
,則它是指向量對象。
&vecInventory
是矢量對象的地址。 所以&vecInventory
只是數字100,因為那是矢量對象的存儲位置。
因此,現在將&vecInventory
傳遞給ptrToElement
,該函數將接收值100,該值存儲在pVec
。 因此, pVec
包含數字100。
*pVec
表示存儲在指針中存儲位置的事物。 pVec
包含值100,它是矢量對象的存儲位置,因此*pVec
是矢量對象。
您可能只是將vecInventory
矢量對象直接傳遞給ptrToElement
,而不是傳遞矢量對象的內存位置,但是將值傳遞給函數意味着復制傳遞的值。 因此,如果您傳遞一個數字(例如存儲位置),則僅復制一個數字,而如果該對象確實很大,則直接傳遞對象可能會成為問題,因為復制非常大的對象可能需要一段時間。 在這種情況下,因為向量很小(您放入向量中的數據不會存儲在向量對象中)就沒有關系。
(*pVec)[i]
是存儲在向量入口i處的值。 還記得我說過您放入向量中的數據沒有存儲在向量對象中嗎? 因此,在您的示例中,當i = 0時,為演示起見,我們將向量索引0處的值存儲在從地址50開始的內存中。
&(*pVec)[i]
當i = 0時是數字50,因為這是索引0的值存儲在內存中的位置。 這意味着從ptrToElement(&vecInventory,0)
返回的值是數字50。
*( ptrToElement(&vecInventory,0) )
表示存儲在指針中存儲位置的東西。 ptrToElement(&vecInventory,0)
返回值50,它是存儲在索引0處的值的存儲位置,因此*( ptrToElement(&vecInventory,0) )
是存儲在矢量對象的索引0處的值。
因此,在我們的示例演示中:
vecInventory
是矢量對象(存儲在內存位置100中) &vecInventory
是內存位置100 pVec
是內存位置100 *pVec
是矢量對象(存儲在存儲位置100中) (*pVec)[i]
當i = 0時是矢量索引0處的值(存儲在存儲位置50中) &(*pVec)[i]
是存儲位置50 ptrToElement(&vecInventory,0)
是內存位置50 *( ptrToElement(&vecInventory,0) )
是向量的索引0處的值(存儲在內存位置50)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.