std::string.c_str()
返回一个(const char *)值。我用Google搜索,发现我可以执行以下操作:
std::string myString = "Hello World";
char *buf = &myString[0];
这怎么可能? &myString[0]
是std::string
类型的对象,那么它如何运作?
答案 0 :(得分:9)
类型的对象
&myString[0]
是std::string
不,不是。 myString[0]
是对字符串的第一个字符的引用; &myString[0]
是指向该角色的指针。运算符优先级是&(myString[0])
而不是(&mystring)[0]
。
请注意,以这种方式访问,不能保证字符串将被零终止;因此,如果您在需要零终止字符串的C样式函数中使用它,那么您将依赖于未定义的行为。
答案 1 :(得分:4)
const
有const
和非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]
是对字符串的第一个字符的(可修改的)引用。如果取这个地址,你会得到一个指向数组中第一个字符的指针。