簡體   English   中英

從函數返回向量指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM