在内存里的布局,与C字符串(char*
)不同的是,C字符串以0
结尾,而string
字符串由于有专门记录其长度的属性,在实现的时候,并没有严格要求是否以0
结尾!
但是在C++11标准推出后,要求string字符串也以0
结尾;
int arr[5]{1,2,3,4,5};
std::cout << (int)&arr << " " << (int)&arr[0] << " " << (int)&arr[1] << std::endl;
std::string str{ "12345" };
std::cout << (int)&str << " " << (int)&str[0] << " " << (int)&str[1] << std::endl;
执行以上代码,结果的:
- arr log :
12385100 12385100 12385104
- str log :
12385128 12385132 12385133
由结果可知:和数组不同,str的初始地址(int)&str
并不是str
首元素的地址;而是(int)&str + 4字节
,如果想要获取string
存储字符的内存空间,可通过如下方法:
- 通过
.c_str()
方法可以得到一个const char*
的指针,指向str存储字符数据的内存空间;
const char* baseStr = str.c_str();
std::cout << (int)baseStr << std::endl; //12385132
- 通过
.data()
方法可以得到一个const char*
的指针,指向str存储字符数据的内存空间;
const char* dataStr = str.data();
std::cout << (int)dataStr << std::endl; //12385132
注意:在C++17标准下
.data()
方法得到的是一个char*
的指针。