You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用指针获取string指定索引位置的字符?

如何用指针访问std::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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:58:29