簡體   English   中英

C ++,字符串和指針

[英]C++, strings, and pointers

我知道這很簡陋但我對C ++一無所知。 有必要這樣做:

string *str = getNextRequest();

而不是

string str = getNextRequest();

為了在稍后的同一代碼塊中引用str? 如果是這樣,后者會產生什么類型的錯誤?

這完全取決於getNextRequest的返回類型。

字符串可以在它們聲明的范圍內使用和重用。它們基本上包含一個可變的C字符串和一些處理信息,輔助方法等。

您可以非常安全地從函數返回一個字符串,編譯器將根據需要復制或移動它。 然后可以正常使用該字符串(此處為str ),而無需擔心使用范圍外的本地等。

有時候需要一個指向字符串的指針,但除非你將它用作out參數,否則這些指針很少見並且表明某些設計有些奇怪。

您使用哪個取決於getNextRequest()返回的內容。 如果它返回一個string * ,那么使用第一行,如果它返回string則使用第二行。

所以如果getNextRequest的聲明是這樣的:

string getNextRequest();

然后

string str = getNextRequest();

是正確的。 如果聲明是這樣的:

string *getNextRequest();

然后你可以去

string *str = getNextRequest();

要么

string str = *getNextRequest();
string str = getNextRequest();

將創建getNextRequest返回的stringgetNextRequest 如果要更改str的內容並希望這些更改也在getNextRequest返回的字符串中, getNextRequest必須返回指針或引用。

如果這是你想要的,那么你應該將getNextRequest定義為:

string& getNextRequest()

並使用它像:

string& str = getNextRequest();

string str * = getNextRequest();

正如@dasblinkenlight所指出的那樣,這將是一個語法錯誤

但要回答你原來的問題,是否有必要? 不可以。一般情況下,除非必須,否則不應使用指針。

特別是STL。 STL不是設計用於指針 - 它為您進行動態內存管理。 除非你有充分的理由,否則你應該總是使用vector<int> vstring s而不是vector<int>*string*

您可能需要提供有關此函數getNextRequest()的更多信息。 這個從哪里來? 圖書館? API? 目的?

如果函數的返回類型是字符串*(指向str的指針),則該字符串已分配給“堆”。 這意味着,從哪個代碼塊引用字符串並不重要。 只要你保持指針,你就可以訪問它。

如果函數的返回類型只是一個字符串(意思不是指針),它將返回值,而不是str的地址。 實質上,您將字符串“復制”到新變量中。 在這種情況下,變量將在堆棧上分配,並且只能在代碼塊的范圍內引用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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