修改string字符串的内容,下标操作符[]和at都会返回字符的引用。但当字符串的内存被重新分配之后,可能发生错误
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> void test01() { string s = "abcd"; char& a = s[2]; //此时取到的是abcdef时的内存地址 char& b = s[3]; a = '1'; b = '2'; cout << s << endl; cout << (int*)s.c_str() << endl; //获取abcdef时的内存地址 s = "pppppppppppp"; //此时内存地址可能改变 a = '1'; //因为原地址没有被改变 所以可以运行 b = '2'; cout << s << endl; cout << (int*)s.c_str() << endl; //获取ppppppppppppppp时的内存地址 s = "ppppppppppppppp啊啊啊啊啊啊啊"; //此时s的内存地址发生改变 指向ppppppppppppppp啊啊啊啊啊啊啊的内存地址 a = '1'; //因为原地址被改变 a指向的还是原来的地址 已经失效的地址 没有指针指向的地址 所以error b = '2'; cout << s << endl; cout << (int*)s.c_str() << endl; //获取ppppppppppppppp啊啊啊啊啊啊啊时的内存地址 } int main() { test01(); system("Pause"); return 0; }
结果:
结果可以看出 ,第一次改变s字符串的时候并没有引发内存重新分配,所以内存地址相同,a和b能改变字符串的数值
而s第二次改变数值时引发了错误
先不修改 a和b的数值 看下内存地址
结果:
可以看出 前两次内存一致,第三次内存地址发生改变
案例:大小写转换
void test02() { //全变大写字母 string str = "AbcDeF"; for (int i = 0; i < str.size(); i++) { str[i] = toupper(str[i]); } cout << str << endl; }