char简单易用,但是string是万金油
char *b = "123";
string a{"123"};
a是不是地址
发现a是地址
a的地址是不是和a[0]地址重合
#include<iostream>
#include<cstring>
using namespace std;
int main() {
string a{ "123" };
char g[4] = "123";
char* b = g;
cout << (int) & a << " " << (int) & a[0] << " " << &a[0] << endl;
return 0;
}
发现并不重合,中间隔来一些东西(中间隔了运算符的重载)
同时必须要用(int)来强制转换才能输出地址
char+char和string加string的区别
char u = '1';
char l = '0';
cout << u + l << endl;
是ascii码直接相加
string a{ "123" };
string f{ "45678912345667822242" };
cout << (int)&a << " " << (int)&f << " " <<endl;
a = a + f;
cout << a << " "<<(int)&a << endl;
发现前后a的地址没有改变,因为内存中连续的地址空间还足够,所以不用重新分配,不够时候是需要重新分配的(编译器自动)
取得string字符部分地址(跳过运算符重载的部分)
a.c_str();
string a{ "123" };
cout << (int)&a[0] << " " << (int)a.c_str() << endl;
a.data()
同理
两者区别和联系
在c++17标准以前,c_str()和data(),返回的都是const char*类型,在c++17标准以后data()返回的是char*类型
用强制类型转换研究一下底层原理
string a{ "123" };
char* h = (char*)a.c_str();
h[0] = 't';
cout << a << endl;
发现a被改变了,和之前那个const int实验不一样
换成*h = 't';
依然是t23
为什么和int那个实验不一样,等后面学完<<STL源码刨析>>就知道了