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

C++中使用指针函数修改string单个字符异常问题咨询

问题分析与修复方案

错误原因

你在changeStr函数里写的mystring[0] = 'T';是错误的。这里的mystring是string*类型(指向string对象的指针),mystring[0]等价于*(mystring + 0),也就是直接解引用指针得到整个string对象。把单个字符'T'赋值给这个对象时,会触发string的隐式构造,将字符转换成长度为1的字符串,所以原字符串被整个替换成了"T",而非修改第一个字符。

char[] 和 string 的区别

  • char[]本质是指向数组第一个字符的指针,所以用char*接收char[]时,ptr[0]就是访问数组的第一个字符。
  • string是C++标准库提供的类对象,它内部封装了字符数组,但本身不是指针。string*是指向这个类对象的指针,不是指向内部字符数组的指针,因此不能直接用指针下标访问字符串里的单个字符。

修复方法

方法1:解引用指针后再访问字符

先通过*解引用指针拿到string对象,再用[]访问第一个字符:

#include <iostream>
#include <string>
using namespace std;

void changeStr(string* mystring);

int main() {
  string mystring = "Hello";
  changeStr(&mystring);
  cout << mystring;
  return 0;
}

void changeStr(string* mystring)
{
    (*mystring)[0] = 'T'; // 先解引用指针,再访问字符
}

方法2:改用引用传参(推荐)

C++里修改函数参数更常用引用传参,比指针更直观安全,无需手动解引用:

#include <iostream>
#include <string>
using namespace std;

void changeStr(string& mystring); // 参数改为string&

int main() {
  string mystring = "Hello";
  changeStr(mystring); // 直接传对象,不用取地址
  cout << mystring;
  return 0;
}

void changeStr(string& mystring)
{
    mystring[0] = 'T'; // 直接访问字符,和主函数里的写法一致
}

两种方法都能正确输出Tello,推荐使用第二种,更符合C++的编码习惯。

内容的提问来源于stack exchange,提问作者Bele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:42:19