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
相关产品推荐
相关产品推荐

