2

std::string.c_str()返回一个 (const char *) 值。我用谷歌搜索,发现我可以做到以下几点:

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

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

4

7 回答 7

9

&myString[0]是类型的对象std::string

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

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

于 2013-07-23T14:32:00.183 回答
4

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

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

请注意,既然s[0]返回char&,那么&s[0]就是元素的地址s[0]。您可以将该地址分配给char*. 不要滥用此指针由您决定。

于 2013-07-23T14:32:17.043 回答
3

它与运算符优先级有关。运算符的[]优先级高于 address-of 运算符&,因此 address-of 运算符作用于 stringsoperator[]函数返回的字符引用。

于 2013-07-23T14:29:56.987 回答
2

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

所以,myString[0]返回类型不是std::stringbut char&

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

myString[0] = 'h';
于 2013-07-23T14:31:37.013 回答
2

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

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

const char* c_str() const;

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

       char& operator[] (size_t pos);
 const char& operator[] (size_t pos) const;
于 2013-07-23T14:31:53.787 回答
1

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

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

于 2013-07-23T14:30:13.160 回答
1

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

于 2013-07-23T14:31:14.440 回答