如何用指针获取string指定索引位置的字符?
嘿,我来帮你搞定这个问题~你遇到的编译错误,核心原因是运算符优先级在搞鬼!
先理清楚你的代码逻辑:你定义了string *str=&name;,这是一个指向std::string对象的指针。然后你尝试写cout << *str[0];,这里的问题是:[]运算符的优先级比*更高,所以编译器会把它解析成*(str[0])——也就是把str当成一个std::string数组,取它的第0个元素再解引用,但str只是单个指针,不是数组,自然会编译失败。
那正确的写法是什么呢?有两种常用的方式:
方式一:先解引用指针,再使用[]运算符
你需要先通过*str拿到指针指向的std::string对象,再调用它的[]成员运算符访问指定索引的字符。代码如下:
#include <iostream> #include <string> int main() { std::string name = "StackOverflow"; std::string *str = &name; // 先解引用指针得到string对象,再访问索引0的字符 std::cout << (*str)[0] << std::endl; // 输出 'S' std::cout << (*str)[5] << std::endl; // 输出 'O' return 0; }
这里的(*str)是关键,它确保我们先拿到真正的std::string实例,之后的[index]就和直接写name[index]完全一样了。
方式二:利用string的字符指针接口做算术运算
std::string提供了data()和c_str()方法,它们会返回指向底层字符数组首地址的const char*指针(C++11之后data()也可以返回非const指针,取决于string是否为const)。你可以通过指针算术来访问指定索引的字符:
#include <iostream> #include <string> int main() { std::string name = "StackOverflow"; std::string *str = &name; // 通过data()获取字符指针,加上索引后解引用 std::cout << *(str->data() + 0) << std::endl; // 输出 'S' std::cout << *(str->c_str() + 5) << std::endl; // 输出 'O' return 0; }
这里str->data()等价于(*str).data(),因为->是指针访问成员的运算符,用来调用std::string的成员方法。
额外提醒
虽然std::string底层确实是字符数组,但它是一个封装好的类,不是原生的字符数组。所以指向std::string的指针和指向char[]的指针用法是不一样的——后者可以直接用ptr[index],但前者必须先拿到对象本身,再操作。
另外,使用指针的时候一定要确保它指向的是有效的std::string对象,避免空指针或者野指针的问题哦!
内容的提问来源于stack exchange,提问作者Idaisa

