C ++,字符串和指针

时间:2012-02-16 14:54:12

标签: c++ string pointers

我知道这很简陋但我对C ++一无所知。是否有必要这样做:

string *str = getNextRequest();

而不是

string str = getNextRequest();

为了稍后在同一代码块中引用str?如果是这样,后者会产生什么类型的错误?

5 个答案:

答案 0 :(得分:10)

这完全取决于getNextRequest的返回类型。

字符串可以在它们声明的范围内使用和重用。它们基本上包含一个可变的C字符串和一些处理信息,辅助方法等。

您可以非常安全地从函数返回一个字符串,编译器将根据需要复制或移动它。然后可以正常使用该字符串(此处为str),无需担心使用范围外的本地人等。

有时需要指向字符串的指针,但除非你将它用作out参数,否则这些指针往往很少见,并指出一些设计奇怪。

答案 1 :(得分:0)

您使用的内容取决于getNextRequest()返回的内容。如果它返回string *,则使用第一行,如果它返回string,则使用第二行。

因此,如果getNextRequest的声明是这样的:

string getNextRequest();

然后

string str = getNextRequest();

是对的。如果声明是这样的:

string *getNextRequest();

然后你可以选择

string *str = getNextRequest();

string str = *getNextRequest();

答案 2 :(得分:0)

string str = getNextRequest();

将创建string返回的getNextRequest的副本。如果要更改str的内容并希望这些更改也在getNextRequest返回的字符串中,则必须返回指针或引用。

如果这是您想要的,那么您应该将getNextRequest定义为:

string& getNextRequest()

并使用它:

string& str = getNextRequest();

答案 3 :(得分:0)

  

string str * = getNextRequest();

如@dasblinkenlight所述,这将是语法错误

但要回答你原来的问题,是否有必要?不可以。一般情况下,除非必须,否则不应使用指针。

特别是STL。 STL不是设计用于指针 - 它为您进行动态内存管理。除非您有充分的理由,否则应始终使用vector<int> vstring s而不是vector<int>*string*

答案 4 :(得分:0)

您可能需要提供有关此函数getNextRequest()的更多信息。这个从哪里来?图书馆? API?目的

如果函数的返回类型是字符串*(指向str的指针),则该字符串已分配给“堆”。这意味着,从哪个代码块引用字符串并不重要。只要你保持指针,你就可以访问它。

如果函数的返回类型只是一个字符串(意思不是指针),它将返回值,而不是str的地址。实质上,您将字符串“复制”到新变量中。在这种情况下,变量将在堆栈上分配,并且只能在代码块的范围内引用它。