char a[3]:编译器会给数组分配3个单元,每个单元的数据类型为字符
char *s:这是个指针变量,只占四个字节,保存的是地址
char a[3] = “ab”;
//这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为’\0’。
cout<<strlen(a)<<endl; //2
cout<<sizeof(a)<<endl;//3
a[0] = ‘m’;
cout<<a<<end; //mb
char a[3] = “a”;
cout<<strlen(a)<<endl; //1
cout<<sizeof(a)<<endl;//3
a[1] = ‘m’;
cout<<a<<end; //am
char b[5] = {‘a’,’b’,’c’,’d’,’\0’};
//这种方法或者 char c[] = {‘1’,’2’,’3’}定义时,系统不会自动在字符串的末尾添加字符串结束符即’\0’,用strlen函数将不能正确求出其长度,因为strlen是通过\0来判断字符串结束的;但sizeof()函数可以正确求出其所占内存大小。因此需要人为添加’\0’。这种方法char a[4]={‘a’,’b’,’c’}定义时,系统会自动从未初始化的元素开始,将之后的元素赋为’\0’。
cout<<strlen(a)<<endl; //4
cout<<sizeof(a)<<endl;//5
cout<<b<<endl; //abcd
char a[]; // 错误定义
a[] = “abc”; //错误定义
char*e;
e = “xie”
cout<<strlen(e)<<endl;//3
cout<<sizeof(e)<<endl;//4
e[0] = ‘m’; //不能如此访问
//char*e 的”xie”是常量所以被分配在常量存储区,e为字符指针类型是存放在栈区可以被更改,而常量存取区是只读区域,不可以被更改。char a[3] = “ab”的字符a和b是存放在栈区的所以可以进行写操作。
string s;
s = “abc”;
s[0] = ‘m’;
cout<<s<<endl;//mbc
cout<<s.size()<<endl;//3
C中是没有string类型的数据的,C中的字符串类型是用char[]和char*来定义的;
在C中的<string.h>头文件里声明的函数原型都是针对char数组进行操作的,比如strcmp,strcpy,strcat等。
C++中string表示一种特殊的类,和vector、list等一样是标准库类型,支持长度可变的字符串,提供各种有用的操作,其中内存管理由系统处理。
String类型的字符串可以直接使用==来比较,但char数组的字符串需要使用strcmp来进行比较。
参考链接:
https://blog.csdn.net/qq330214001/article/details/88372063
https://www.cnblogs.com/X-Do-Better/p/8628492.html
https://www.linuxidc.com/Linux/2012-09/70818.htm
https://blog.csdn.net/kidults/article/details/80747578(相互转换可参考该链接)