const char与char数组vs std :: string的指针

时间:2012-02-22 10:44:37

标签: c++

这里我有两行代码

const char * s1 = "test";
char s2 [] = "test";

这两行代码具有相同的行为,因此我不应该看到s1优先于s2还是反之亦然。除了s1和s2之外,还有使用std::string的方法。我认为使用std :: string的方式是最优雅的。在查看其他代码时,我经常会看到人们use const char *char s []。因此,我的问题是,我应该何时使用const char * s1char s []std::string?我应该使用哪种方法有什么区别和哪种情况?

7 个答案:

答案 0 :(得分:10)

POINTERS
--------

char const* s1 = "test";  // pointer to string literal - do not modify!

char* s1       = "test";  // pointer to string literal - do not modify!
                          //   (conversion to non-const deprecated in C++03 and
                          //       disallowed in C++11)

ARRAYS
------

char s1[5]     = "test";  // mutable character array copied from string literal
                          //    - do what you like with it!

char s1[]      = "test";  // as above, but with size deduced from initialisation



CLASS-TYPE OBJECTS
------------------

std::string s1 = "test";  // C++ string object with data copied from string
                          //    literal - almost always what you *really* want

答案 1 :(得分:9)

const char * s1 = "test";
char s2 [] = "test";

这两个不完全相同。 s1是不可变的:它指向恒定的内存。修改字符串文字是未定义的行为。

是的,在C ++中你应该更喜欢std::string

答案 2 :(得分:3)

第一个是常数,第二个不是。 std :: string是一个类类型,它为字符串操作实现了许多有用的函数和方法,使其更容易和用户友好。带有char指针的c风格“字符串”很难控制,操作并经常导致错误,但是没有std :: string的开销。一般来说,最好坚持使用std :: strings,因为它们更容易维护。

答案 3 :(得分:3)

你应该关心的两者之间的唯一区别是:

您的项目已经使用了哪一个?

答案 4 :(得分:3)

这两个具有相同的行为。 s1是一个简单的指针,它被初始化为指向内存的某个(通常是只读的)区域。另一方面,s2定义了一个大小为5的本地数组,并用该字符串的副本填充它。

正式地,您不能修改s1,即执行s1[0] = 'a'之类的操作。特别是,在奇怪的情况下,它可能会导致程序中的所有其他"test"成为"aest",因为它们都共享相同的内存。这就是当你编写

时现代编译器大喊大叫的原因
char* s = "test";

另一方面,允许修改s2,因为它是本地副本。

换句话说,在以下示例中,

const char* s1 = "test";
const char* s2 = "test";
char s3[] = "test";
char s4[] = "test";

s1s2可能很好地指向内存中的相同地址,而s3s4是两个不同的副本相同的字符串,并驻留在不同的内存区域。

如果您正在编写C ++,请使用std::string,除非您绝对需要一个字符数组。如果您需要可修改的字符数组,请使用char s[]。如果您只需要一个不可变的字符串,请使用const char*

答案 5 :(得分:0)

使用哪一个取决于您的要求。指针为您提供更大的灵活性。在某些情况下还有漏洞。字符串是一种安全的选择,它们提供Iterator支持。

答案 6 :(得分:0)

使用std::string,除非您知道为什么需要char数组/指向char的指针。