BZ易风

导航

 

修改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;
}

 

posted on 2021-08-26 13:51  BZ易风  阅读(59)  评论(0编辑  收藏  举报