字符数组的特殊性
使用字符串字面值给字符数组初始化时,会添加一个空字符,需要留出空间
char a1[] = {'C'} //会再添加一个为'\0'的空字符 数组长度为2
不允许拷贝和赋值
不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其它数组赋值
可能有编译器拓展(compiler extension)使用支持数组拓展,但是为了程序通用性,不推荐
理解复杂数组的声明 (存疑 int (&arrref)[10] = arr;不会理解)
可以定义一个存放指针的数组,允许定义数组的指针和数组的引用。
int *ptrs[10]; //ptrs是一个含有10个整型指针的数组 int &refs[10] = //不存在引用的数组
int (*ptrs)[10] = &arr; //ptrs是指向一个含有十个整数的数组
3.5.2 访问数组元素
数组可以使用下标访问,下标定义成size_t 类型。
可以使用for语法进行遍历
检查下标的值
需要程序员细心检查。大多数常见的安全问题都源于缓冲区一处错误,当数组或者其它类似结构的下标越界并试图访问非法内存区时,就会产生错误。
3.5.3 指针和数组
一般使用取地址符“&”来获得某个对象的指针。数组也相同,下标可以获得该数组指定位置的元素,然后使用取地址符得到指向该元素的指针。
string *p = &nums[0];
如果不指定位置,指针指向数组的首位。
可以推出,一些情况下数组的操作实际上是指针的操作。再推出使用数组作为一个auto变量的初始值,推断得到的类型是指针而不是数组。
int ia[] ; auto ia2(ia); 得到的ia2类型是数组。针对一个地址的类型显然是指针。
指针也是迭代器
指向数组元素的指针拥有更多功能,vector和string的迭代器支持的运算,数组的指针全都支持。允许使递增运算符将数组元素的指针向前移动倒下一个元素上。
上面这么做的前提是已经获取一个指向头元素的指针。获取尾后指针需要使用特定性质
int arr[10]; //int *e = &arr[10]; 指向arr尾元素的下一个指针 可以利用此写出类似迭代循环
标准库函数begin和end
C++11新标准为了避免上述操作出现问题,引入了begin和end函数,但是并非成员函数,需要指定的调用方式
int a[10]; int *beg = begin(a); int *last = end(a);
begin返回头元素,end返回尾后元素,这两个函数定义在iterator头文件中。
注意尾后指针不能执行解引用和递增操作。
指针运算
指针可迭代器类似,拥有解引用、递增、比较、整数相加和指针相减功能。
与整数加减法就是指针前进后退几个元素,相互减法就是求距离,类型为(ptrdiff_t 带符号类型)
加减法中,编译器不会提示已经超过数组大小,需要自己注意
只要两个指针指向同一个数组就可以互相比较,比较出是位置;指向不同数组比较毫无意义
解引用和指针运算交互
指针加上整数得到一个新指针,允许使用解引用改指针。int ia[] ; int last = *(ia +4);
如果是 last = *ia +4;则是ia的第一个元素值 加上4。
下标和指针
如果使用了下标运算,则数组会指向加了整数值下标的元素位置。 数组的下标运算符不是无符号类型,与vector和string不一样,可以使用下标前进或向后移动。
3.5.4 C风格字符串
尽管C++支持C风格字符串,但是在C++程序中最好还是不要使用它们,很容易引发程序漏洞C风格字符串习惯放在字符数组中并以空字符结束(null)
C标准库String函数
用于操作C风格字符串的函数。必须要以null结束
char ca[] = { ‘c’} ; strlen(ca); 错误,必须以null结束
比较字符串
比较C风格字符串方法和之前差不多。在标准string库时候使用普通的关系运算符和相等性运算符;在C风格字符串时则是指针而非字符串本身。
如果想比较C风格字符串需要使用strcmp函数,这时候就不是比较指针。如果相等返回0,前大为正,后大为负。
目标字符串的大小由调用者指定。
C++第八天 2016-12-07 3.5-3.5
最新推荐文章于 2022-07-20 19:35:23 发布