必会知识点。
目录
一、talk is cheap
二、划重点
三、助记
一、talk is cheap
#include <iostream>#include <string>#include <cstring>using namespace std;int main() { // char[] 转 char*、string,直接赋值 char ch0[] = "ali"; char *str00 = ch0; str00[0] = 'x'; // str00指向的是array首地址,可以修改 string str01 = ch0; cout << ch0 << endl; // xli cout << str00 << endl; // xli cout << str01 << endl; // xli // char* 转 char[]、string char tmp[] = "bli"; char *str10 = tmp; char ch1[10] = {0}; strcpy(ch1, str10); // 用strcpy(dst, src) string str11 = str10; // 直接赋值 str11[0] = 'd'; cout << str10 << endl; // bli cout << ch1 <<endl; // bli cout << str11 << endl; // dli // string 转 char*、char[] string str20 = "cli"; char* str21 = const_cast<char*>(str20.data()); // 用data(),c++11前不含/0,c++11后与c_str()相同 str20[0] = 'z'; // 可以修改 char* str22 = const_cast<char*>(str20.c_str()); // 用c_str(),含/0 char ch2[10] = {0}; strcpy(ch2, str20.c_str()); // 用strcpy(dst, src)配合c_str() cout << str20 << endl; // zli cout << str21 << endl; // zli cout << str22 << endl; // zli cout << ch2 << endl; // zli return 0;}
二、划重点
不经思考是记不住的,让我们来看看为什么是这样转!
char[]是array,char*是pointer,string是c++定义的一个类型,字符串"ali"并不是string,字符串是const的不可修改,而sting是内置类装数据(比如"cli")和接口(比如c_string()),里面数据可以修改。
字符串总是以'\0'结尾,char[]="ali",实际char[]存储了'a'、'l'、'i'、'\0'。既然这样,当然char[]转char*和string都可以直接赋值。char*转char[]要用strcpy(dst, src),char*转string直接赋值即可。string是个“盒子”,转其他格式当然要先取数据,用data()或c_str()。对于c++11俩接口没区别,c++11之前data()不含'\0'。但要注意data()或c_str()返回常量指针const char*,需要去const属性。既然返回的是const char*,转char[]当然就跟char*转char[]一样,用strcpy(dst, src)。
三、助记
转string,可以直接赋值。
转char*,char[]是直接赋值,string要c_str()取数据然后去const。
转char[],都要用strcpy(dst, src)。dst、src是指针。