C++、字符串和指针

C++, strings, and pointers

本文关键字:指针 字符串 C++      更新时间:2023-10-16

我知道这是初级的,但我对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();

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

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

string& getNextRequest()

并像一样使用

string& str = getNextRequest();

string str*=getNextRequest();

正如@dasblinkenlight所指出的,这将是的语法错误

但要回答你最初的问题,有必要吗?不可以。一般来说,除非必须,否则不应该使用指针。

尤其是STL。STL并不是为与指针一起使用而设计的——它为您进行动态内存管理。除非有充分的理由,否则应始终使用vector<int> vstring s,而不是vector<int>*string*

您可能需要提供更多关于此函数getNextRequest()的信息。它是从哪里来的?图书馆API意图

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

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