刚学C++那会,真的是对字符串头痛了好久,就是后面自己一不小心还是容易在字符串上犯错误,自己觉得这里就是一个大坑,在看完了c++ primer对于字符串的描述之后感觉自己对于字符串已经没有那种遥不可及的神秘感了,所以还是C++primer大法好。言归正传,该介绍一下字符串的内容了。
1.字符串
字符作为一种基本的数据类型,但是实际中确实字符串用的更多,但比较坑爹的就是C++中是没有专门为字符串写一个基本的数据类型的。但是C++对此的不久也是不少的,比如C++是有一个C-style string的说法的,和字符数组有一点不一样的。
char arr1[11] = "HelloWorld"
char arr2[10]={'H','e','l','l','W','o','r','l','d'};//not a string
char arr3[11]={'H','e','l','l','W','o','r','l','d','\0'};//the same string as arr1.
我记得很清楚的一句话说明了数组和字符串的区别就是(自己的理解,不是原话)
当你把一个数组传给函数的时候,你只给一个 数组名是不够的(也就四数组的地址)因为你不知道数组的长度,你是不能够放心的对数组进行操作的,所以往往还要传一个数组长度的整数,但是对于一个string来说就不同了,传一个名字就能够获取这个string的信息,因为C++规定了string的结尾都是'\0',所以函数操作string不需要他的长度,只需要通过'\0'来控制
而对于数组的操作肯定就少不了相应指针的帮忙,所以就有了字符指针
char *p1 = arr;//一开始还会觉得奇怪数组名是指针,但是后面学的越多,就觉得没什么了,甚至还有点巧妙
重点来了,就是对于指针的运算,开始的时候真的让人头昏
using namespace std;
int main()
{
char arr1[12] = "HelloWorld";
char *p1 = arr;
cout<<*p1<<endl;
p1++;
cout<<*p1<<"at"<<p1<<endl;
char **p2 = &arr;
p2++;
cout<<*p2<<"at"<<p2<<endl;//dangerous
}
输出的结果可能会让你觉得神奇(如果你以前没学过的话)
对于&符号作用于一个数组名,其实是一种指向指针的指针。
对于这个问题,C++primer作了一个比较好的解释,就是*是相当于把一个指针降低了一个等级,而&取址符相当于把指针升了一个等级。例如题中p1=&arr;
把p1定义为一个指向整个数组的一个指针对象,而之前的p1=arr;
是把p1定义为一个指向数组元素的指针对象。对应++号跳过指针指向的一个最小指向对象。
2.字符串输出
c++中对于字符数组的输出仿佛是别有用心。一开始的时候都会感觉有点奇怪。
char word[] = "helloworld";
char *p1 = word;
cout<<word<<endl;
cout<<*p1<<endl;
cout<<p1<<endl;
结果是
helloworld
helloworld