C风格字符串规定,字符串以字符数组的形式储存,必须以空字符‘\0’结束,以便用指针进行操作。
在计算字符长度时这个空字符不算在内,但是它会占用内存空间
所以如果给定了大小的字符数组,例如char a[5],就只有a[0],a[1],a[2],a[3],这4个位置能存储字符,而a[4]必须留给空字符’\0’。
如果以单个字符储存的话,如char a[5]={‘a’,‘b’,‘c’,‘d’,’\0’},末尾需要手动补一个’\0’,如果直接写成一个串的形式,系统会自动补0。
比如char b[]=“abcdef” , b中6个字节用来存储字符,另外一个自动补成了’\0’,所以b的大小为7字节。
string是一个类,不需要以’\0’为结尾。
再举个例子看一下你理解了没有
int main()
{
string s = "abc";
s+= '\0';
s+="def";
cout << s;//输出abc def
cout << s.c_str()<<endl;//输出abc
cout<<(s.c_str()+4)<<endl;//输出def
}
直接输出s的结果是abc def,string中间的空字符’\0’没有被识别成字符串结束的标志,所以按照它本来的意义,输出了空字符。
通过c_str()将string转化成C风格字符串后,’\0’被识别成了字符串结束的标志,所以输出了abc
s.c_str()+4指向C风格字符串的d字符,从这个字符开始输出字符串,直到遇到一个’\0’空字符。s.c_str()将string转化成C风格字符串时,自动在其末尾添加了一个’\0’,遇到这个空字符时输出结束,所以输出结果为def。