std::string.c_str()
返回一个(const char *)值。我谷歌搜索,发现我可以做到以下几点:std :: string gets(char *)而不是(const char *)
std::string myString = "Hello World";
char *buf = &myString[0];
这怎么可能? &myString[0]
是std::string
类型的对象,所以它如何工作?
std::string.c_str()
返回一个(const char *)值。我谷歌搜索,发现我可以做到以下几点:std :: string gets(char *)而不是(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风格的函数中使用它,这个函数需要一个以零结尾的字符串,那么你将依赖未定义的行为。
它与operator precedence有关。 []
运算符的优先级高于运算符地址&
,所以运算符地址对字符串operator[]
函数返回的字符引用起作用。
+1表示优先。从语法看这是一个不同的角度。 – Nawaz
你错了。 &myString[0]
不是std::string
类型,它是char *
类型。
的[]
操作者具有较高的优先级和operator[]
返回到char
的引用,其地址(&
操作者)是char *
类型。
std::string
类型有一个operator[]
,它允许索引字符串中的每个字符。表达式myString[0]
是对字符串的第一个字符的(可修改的)引用。如果你采用这个地址,你会得到一个指向数组中第一个字符的指针。
运算符[]
(std::string::char& operator[] (size_t pos))重载会返回索引处字符的引用。你正在采取这种字符引用的地址,这很好。
因此,myString[0]
返回类型不是std::string
而是char&
。
没有理由这样做。您可以直接做 -
myString[0] = 'h';
的的std :: string方法c_str()
和operator[]
是2 diferent方法,它返回两个不同的类型。
方法c_str()确实返回const char*
。
const char* c_str() const;
但是,方法operator []返回char的引用。当你把它的地址,你得到一个字符的地址。
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
有const
和std::string::operator[](size_type pos)
非const
重载,和非const版本返回char&
,所以你可以做这样的事情
std::string s("Hello");
s[0] = 'Y';
需要注意的是,由于s[0]
返回char&
,然后&s[0]
是元素地址s[0]
。您可以将该地址分配给char*
。这是由你不要误用这个指针。
“不保证字符串将被零终止”在C++ 03中为true,但C++ 11确实有保证。 –
@TonyD:不,C++ 11并不保证连续存储的字符在它们后面会有一个零;只是'str [size]'会给出一个零值的引用,'c_str()'的结果将被终止。 –
@MikeSeymour:我想知道为什么规范使它变得如此复杂。只需保存一个字节? – Nawaz