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();
将创建CCD_ 6返回的CCD_。如果要更改str
的内容,并且希望这些更改也在getNextRequest
返回的字符串中,则必须返回指针或引用。
如果这是您想要的,那么您应该将getNextRequest
定义为:
string& getNextRequest()
并像一样使用
string& str = getNextRequest();
string str*=getNextRequest();
正如@dasblinkenlight所指出的,这将是的语法错误
但要回答你最初的问题,有必要吗?不可以。一般来说,除非必须,否则不应该使用指针。
尤其是STL。STL并不是为与指针一起使用而设计的——它为您进行动态内存管理。除非有充分的理由,否则应始终使用vector<int> v
和string s
,而不是vector<int>*
或string*
。
您可能需要提供更多关于此函数getNextRequest()的信息。它是从哪里来的?图书馆API意图
如果函数的返回类型是字符串*(指向str的指针),则该字符串已分配给"堆"。这意味着,从哪个代码块引用字符串并不重要。只要你维护指针,你就可以访问它。
如果函数的返回类型只是一个字符串(意思不是指针),它将返回值,而不是str的地址。本质上,你将把字符串"复制"到你的新变量中。在这种情况下,变量将在堆栈上分配,并且只有在代码块的范围内时才能引用它。
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 使用指针初始化 char 数组或字符串 C++
- 指针保留字符串
- Visual c ++,使用字符串引用/指针调用 dll 函数
- strcpy 在类中无法使用字符串指针
- C++为 void 指针分配一个字符串
- OpenGL 统一名称指针作为字符串
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 转换指针引用的字符串
- 未分配释放C++(C 字符串)指针
- 为什么 C 样式字符串的工作空指针检查不?
- 为什么多维数组中的空字符串文本衰减为空指针?
- 使用终止程序的指针在数组中输入字符串
- 将指针作为缓冲区传递到第一个字符串元素
- 指针 - 字符串C
- C++:更改指针字符串的值
- 使用带字符指针字符串的基于范围的For循环
- 转换/解析指针字符串和双精度
- 有问题分配字符串指针字符串值