1.C++中的内置数组类型
C++中的数组是内置数据类型,但不是基础数据类型而是构造数据类型,是有限个相同数据、占据着连续物理存储空间的有序集合。而内置数据类型定义的下标运算符可以处理负值运算(只要在数组范围之内),这和vector及string的下标运算符要求是无符号整数不一样。比如:
int a[10]={ 0 };
int *p = &a[2];
int j=p[1]; // j=a[3];
int k=p[-2]; // k=a[1];
C++11引入begin()和end()(定义在头文件iterator中)两个非成员函数,使用这两个函数可以获得数组的头指针和尾后指针。一般情况下,碰到复杂的数组声明时,采用的原则是从数组名开始,从内到外,从右到左依次结合分析。比如:
int *ptr[10]; //声明一个指针数组,数组里面含有10个整形指针;
int (*ptr)[10]; //声明一个数组指针,指针指向一个含有10个整形元素的首地址;
int (&ptr)[10]; //声明一个数组引用,引用绑定的是一个含有10个整形元素的首地址;
C++规定,不能使用数组或者vector去初始化数组,但是可以允许使用数组的首指针和尾后指针去初始化vector,比如:
int a[10]={0};
vector<int> vec(begin(a),end(a));
对于多维数组遍历或者其他对象如string和vector对象,使用范围for语句能够起到很好的效果。但是由于多维数组中只有最内层的是表示数据类型,其他都是表示指针类型,因此使用范围for语句遍历或修改多维数组的数据时,将除最内层循环变量的其他所有循环变量都设置为引用类型。比如:
int a[3][4][5]={0}; unsigned int cnt = 0 ;
for(auto &i : a)
for(auto &j : i)
for(auto k : j)
k=cnt++:
2.string对象和C风格字符串
C++为了兼容C中的字符串,将C中处理字符串的函数文件string.h变为cstring文件,其中string.h中常用的处理字符串的函数有:
strlen(p) //获取字符串的长度,末尾\0不计算在内;
strcmp(p1,p2); //比较两个字符串的大小,p1=p2,返回0;p1>p2,返回正值;p1<p2:返回负值;
strcat(p1,p2); //将字符串p1和字符串p2拼接,返回p1;(必须保证p1的内存能够完成这个操作)
strcpy(p1,p2): //将字符串p2拷贝给p1,返回p1;(必须保证p1的内存能够完成这个操作)
string中为了兼容C字符串,允许使用字符串字面值来初始化或赋值给string对象,同时允许在string对象的加法运算中一个对象为字符串字面值。除此之外,string中提供一个c_str()的成员函数来得到string对象对应的C风格字符串。