你所说的string应该指std::string。
std::string不等价于char数组,std::string是一个类,char数组就是数组……
“数值类型”应该指每个字符的类型,当然是char;
或者你在问用下标索引的值是否一致('A'<->65),都是char的引用,当然一致。
char数组就是顺序存储结构;std::string也应该是是顺序存储结构,但我不确定会不会有很奇妙的实现。
std::string,作为一个类,实例化以后你就能对实例做各种各样的事情了(参见http://www.cplusplus.com/reference/string/string/);
char数组,数组能怎么用就怎么用。
说到遍历,一种是用下标索引遍历,C++11中规定std::string的下标运算符复杂度为常数,因此这种遍历方法效率不会有什么区别;std::string有迭代器,是随机访问迭代器,因此可以用“for (std::string::iterator i = str.begin(); i != str.end(); i++)
”这一类方式遍历std::string(C++11可以更爽,但这里先不提)。
实际上char数组和std::string没什么可比的,因为是本质不同的东西。
但作为新手,敢于发问是一件好事,我就因为不太敢“问”丢掉了蛮多的学习机会。
当时主要是纠结于'\0',现在自己写了一个,但是还没总结全。http://www.cnblogs.com/holyson/p/3951839.html
欢迎给予补充。
ps:语言方面不算新手了,所以问的比较细,C#,C,obj-C,js 这些都恨深度的研究过,所以现在对C++也是比较认真从底层学好。
@凡图: std::string下标索引时,如果下标等于std::string的长度时,C++98和C++11都会返回字符'\0'
的引用,当然,最好不要修改返回的这个引用。但是std::string::at的行为并非如此,它会抛出out_of_range异常。
@凡图: 在C++98中std::string::data返回指向std::string内容的第一个字符的指针,但不保证结尾有'\0'
。相反,C++11中的std::string::data以及两个版本的std::string::c_str会有这样的保证,甚至可以说,在C++11中std::string::c_str等价于std::string::data。
@凡图: 作为指向std::string内容的std::string::iterator,从std::string::begin一直迭代到std::string::end,结尾不会有字符'\0'
的(那是当然,有std::string::end就不必要用'\0'
标记结尾了)。
@Chielo Newctle: 你说的这东西太复杂了,我认为分析一个东西就应该一针见血,多一个字都是浪费。
我还是自己再看看书理解下吧。
@凡图: 书本什么的扔到一边去吧,毕竟都是老的东西了。http://www.cplusplus.com/reference/string/string/,在这里能找到你想要的东西。
对。
在C里面,字符串的定义是:
char* name = "whos yourdaday";
先定义字符数组:
char name[20] = "whos your daday";
则可以:
char *name = name;
或者
char *name = &name[0];
自己动手写一下就可以了。
char name[20] 表示长度为 20 个字节的定长数组或定长字符串。
string name = "whos your daday",表示一个字符串对象,其内部会分配 strlen("whos your daday")+1 个字节的 buffer,最后一个字节会自动填充为 0。
应该叫空字符('\0')吧,我看书比较严谨和较真,呵呵
@凡图: 你说的也没错。因为我前面说的是分配多少个字节,所以我最后说填充 0,如果我说分配多少个字符,那么就可以说填充 '\0'。
String 是个类,分配内存的时候还要为他分配属性占用的空间.
char name[20]是个基本单位组成的数组,分配内存的时候不用考虑属性这些问题.