Sim*_*ity 14 c++ string pointers char
如果我有一个指向字符串变量的指针,array of chars那么键入是否有区别:
char *name = "name";
Run Code Online (Sandbox Code Playgroud)
和,
string name = "name";
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 29
是的,有区别.主要是因为你可以修改你的字符串,但你不能修改你的第一个版本 - 但是如果你尝试的话,C++编译器甚至不会警告你这是禁止的.
所以总是使用第二个版本.
如果由于某种原因需要使用char指针,请将其设置为const:
char const* str = "name";
Run Code Online (Sandbox Code Playgroud)
现在,如果您尝试修改内容str,编译器将禁止此(正确).您还应该将编译器的警告级别提升一级:然后它会警告您的第一个代码(即char* str = "name")是合法的但是已弃用.
对于初学者,您可能想要改变
string *name = "name";
Run Code Online (Sandbox Code Playgroud)
阅读
string name = "name";
Run Code Online (Sandbox Code Playgroud)
第一个版本不会编译,因为a string*和a char*基本上是不同的类型.
一个之间的差string和一个char*是,char*仅仅是一个指针序列.这种操作字符串的方法基于C编程语言,是字符串在C++中编码的本地方式.使用C字符串有点棘手 - 你需要确保为它们正确分配空间,避免走出它们占用的缓冲区的末尾,将它们放在可变内存中以避免分段错误等.主要功能操纵它们是在<cstring>.大多数C++程序员建议不要使用C风格的字符串,因为它们本来就更难以使用,但它们仍然支持向后兼容性和低级API可以构建的"最低公分母".
C++样式string是封装字符串的对象.用户看不到其内存管理的详细信息(尽管可以保证所有内存都是连续的).它使用运算符重载来使串联等常见操作更容易使用,并且还支持几个用于执行高级操作(如搜索,替换,子串等)的成员函数.它们还可以与STL算法进行互操作,尽管C风格的字符串也可以做到这一点.
简而言之,作为C++程序员,您可能最好使用该string类型.它更安全,更容易使用.了解C风格的字符串仍然很好,因为你在编程生涯中肯定会遇到它们,但最好不要在你的程序中使用它们,string除非有令人信服的理由这样做.
是的,第二个是无效的C++!(它不会编译).
您可以通过string多种方式创建,但有一种方法如下:
string name = "name";
Run Code Online (Sandbox Code Playgroud)
请注意,不需要*,因为我们不需要将其声明为指针.
char* name = "name"应该是无效的,但在大多数系统上编译,以便向后兼容没有 const 的旧时代,如果不编译它会破坏大量遗留代码。不过它通常会收到警告。
危险在于你得到一个指向可写数据的指针(根据 C++ 的规则可写),但如果你真的尝试写入它,你会调用 Undefined Behaviour,并且语言规则应该尽可能地保护你免受这种情况的影响可能的。
正确的构造是
const char * name = "name";
Run Code Online (Sandbox Code Playgroud)
即使在 C++ 中,上述内容也没有任何问题。使用字符串并不总是更正确。
你的第二个陈述真的应该是
std::string name = "name";
Run Code Online (Sandbox Code Playgroud)
string 是basic_string<char,char_traits<char>,allocator<char>标准库中定义的类(实际上是 的 typedef ),因此在命名空间 std 中(basic_string、char_traits 和分配器也是如此)
在各种情况下,使用字符串比使用字符数组更可取。例如,在您的直接情况下,您可以修改它。所以
name[0] = 'N';
Run Code Online (Sandbox Code Playgroud)
(将第一个字母转换为大写)对字符串有效,而对 char*(未定义行为)或 const char *(不会编译)有效。如果你有,你将被允许修改字符串char name[] = "name";
但是,如果想在字符串中附加一个字符,std::string 构造是唯一可以让您干净利落地完成的构造。使用旧的 C API,您将不得不使用 strcat() ,但除非您分配了足够的内存来执行此操作,否则这将无效。
std::string 为您管理内存,因此您不必调用 malloc() 等。实际上,allocator,第三个模板参数,管理下面的内存 - basic_string 请求它需要多少内存,但与实际分离使用内存分配技术,因此即使使用 std::string 也可以使用内存池等来提高效率。
此外,basic_string 实际上并不执行许多字符串操作,而是通过 char_traits 完成的。(这允许它在下面使用经过良好优化的专业 C 函数)。
因此,当您处理在运行时构造和传递的动态字符串(而不仅仅是文字)时,std::string 是管理字符串的最佳方式。
您很少会使用字符串*(指向字符串的指针)。如果这样做,它将是一个指向对象的指针,就像任何其他指针一样。您将无法按照您的方式分配它。
| 归档时间: |
|
| 查看次数: |
49118 次 |
| 最近记录: |