一、char* char[] string
1.1 char*
一个字符指针变量,只占四个字节,32位,用来保存一个地址
char* cp = “123” ;
当编译器遇到这句时,会把str数组中从第一个元素把123\0 逐个填入
这里有一个问题值得思考,char* cp = “123” ;cp是一个指针变量,“123"是一个常量字符串,指针不应该对应的地址吗,岂不是类型不一致了。c语言中字符串常量的本质其实是一个地址,编译器会给字符串常量分配地址,如“123” 存储在内存中是 0x3000 0x3001 0x3002 所以cp = “123” = 0x3000 是不是就合理了。
1.2 char[]
当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。
数组名,他是一个常量类型,所以不能修改
用一句话来概括,就是 char *s 只是一个保存字符串首地址的指针变量,
char a[] 是许多连续的内存单元,单元中的元素为char
1.3 string
用字符数组存放字符串容易发生数组越界的错误,而且往往难以察觉。因此,C++ 标准模板库设计了 string 数据类型,专门用于字符串处理。
string 类型的变量就是用来存放字符串的,也叫“string对象”。string 并不是 C++ 的基本数据类型,它是 C++ 标准模板库中的一个“类”。
要使用 string 对象,必须包含头文件 。
二、 转换
2.1 char* <==> char[]
//char* ==> char[]
char* cp = "123";
char arrc[10] = "4321";
strcpy(arrc,cp); //#include<string.h> 或者 <cstring>
// strncpy(arrc,cp,strlen(cp)+1); //这两个函数方法都可以,这里为什么一定要加1,后面解释
//打印 arrc:123
//char[] ==> char* 直接赋值
char* cp = "123";
char arrc[10] = "4321";
cp = arrc;
//打印 cp:4321
2.2 char* <==> string
//char* ==> string 直接赋值
char* cp = "123";
string str;
str = cp;
// char* ⇒ string 构造拷贝
char* cp = "123";
string str(cp,cp+strlen(cp));
//打印:str:123
//string ==>char*
string str = "123";
char* cp;
cp = const_cast<char*>(str.c_str());
//打印:cp:123
char[] <==> string
//char[] ==> string 直接赋值
char arrc[] = {"123"};
string str = arrc;
//char[] ==> string 构造函数拷贝
char arrc[] = {"123"};
string str(arrc,arrc+strlen(arrc));
//打印:str:123
//string ==> char[]
string str = "123";
char a[] = "4321";
strcpy(a,const_cast<char*>(str.c_str()));//#include<string.h> 或者 <cstring>
//strncpy(a,const_cast<char*>(str.c_str()),str.length()+1);
//打印:a:123;