std :: string getting(char *)而不是(const char *)

时间:2013-07-23 14:27:30

标签: c++ string pointers std

std::string.c_str()返回一个(const char *)值。我用Google搜索,发现我可以执行以下操作:

std::string myString = "Hello World";
char *buf = &myString[0];

这怎么可能? &myString[0]std::string类型的对象,那么它如何运作?

7 个答案:

答案 0 :(得分:9)

  

&myString[0]std::string

类型的对象

不,不是。 myString[0]是对字符串的第一个字符的引用; &myString[0]是指向该角色的指针。运算符优先级是&(myString[0])而不是(&mystring)[0]

请注意,以这种方式访问​​,不能保证字符串将被零终止;因此,如果您在需要零终止字符串的C样式函数中使用它,那么您将依赖于未定义的行为。

答案 1 :(得分:4)

constconst和非std::string::operator[]( size_type pos )重载,而非const版本返回char&,因此您可以执行以下操作:

std::string s("Hello");
s[0] = 'Y';

请注意,由于s[0]返回char&,因此&s[0]是元素s[0]的地址。您可以将该地址分配给char*。你不要滥用这个指针。

答案 2 :(得分:3)

它与operator precedence有关。 []运算符的优先级高于地址运算符&,因此address-of运算符适用于字符串operator[]函数返回的字符引用。

答案 3 :(得分:2)

重载运算符[]std::string::char& operator[] (size_t pos))返回对索引处字符的引用。您正在使用此类字符引用的地址,这很好。

因此,myString[0]返回类型不是std::string,而是char&

没有理由这样做。你可以直接做 -

myString[0] = 'h';

答案 4 :(得分:2)

std :: string方法c_str()operator[]两种不同的方法,它们返回两种不同的类型。

方法c_str()确实返回const char*

const char* c_str() const;

但是,方法operator []返回对char的引用。当你获取它的地址时,你得到一个字符的地址。

       char& operator[] (size_t pos);
 const char& operator[] (size_t pos) const;

答案 5 :(得分:1)

你错了。 &myString[0]不属于std::string类型,属于char *类型。

[]运算符具有更高的优先级,operator[]返回对char的引用,其地址(&运算符)的类型为char *

答案 6 :(得分:1)

std::string类型有operator[],允许索引字符串中的每个字符。表达式myString[0]是对字符串的第一个字符的(可修改的)引用。如果取这个地址,你会得到一个指向数组中第一个字符的指针。