std::string.c_str()
返回一个 (const char *) 值。我用谷歌搜索,发现我可以做到以下几点:
std::string myString = "Hello World";
char *buf = &myString[0];
这怎么可能?&myString[0]
是一个类型的对象std::string
,那么这如何工作?
&myString[0]
是类型的对象std::string
不,不是。myString[0]
是对字符串第一个字符的引用;&myString[0]
是指向该字符的指针。运算符的优先级是这样的,它意味着&(myString[0])
而不是(&mystring)[0]
。
请注意,以这种方式访问,不能保证字符串将以零结尾;因此,如果您在需要零终止字符串的 C 风格函数中使用它,那么您将依赖未定义的行为。
有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*
. 不要滥用此指针由您决定。
它与运算符优先级有关。运算符的[]
优先级高于 address-of 运算符&
,因此 address-of 运算符作用于 stringsoperator[]
函数返回的字符引用。
重载的运算符[]
(std::string::char& operator[] (size_t pos))返回对索引处字符的引用。您正在获取此类字符引用的地址,这很好。
所以,myString[0]
返回类型不是std::string
but char&
。
没有理由这样做。你可以直接做 -
myString[0] = 'h';
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;
你错了。&myString[0]
不是类型std::string
,它是类型char *
。
运算符具有更高的[]
优先级并operator[]
返回对 的引用char
,其地址(&
运算符)为 类型char *
。
该std::string
类型有一个operator[]
允许对字符串中的每个字符进行索引。该表达式myString[0]
是对字符串第一个字符的(可修改的)引用。如果您获取它的地址,您将获得指向数组中第一个字符的指针。