C++ 数组
数组和vector比较类似,也是存放相同类型的对象的容器,与vector不同的是,数组的大小确定不变。
数组的维度必须是常量表达式。

字符数组需要注意

数组不存在以下的拷贝操作

注意有些编译器支持数组赋值的操作,这就是所谓的编译器扩展,但是还是尽力避免非标准特性。
复杂数组的声明

理解数组的含义可以从内向外阅读。例如Parray是一个指针,他指向大小为10的数组,最后他是int型。

访问数组元素
使用数组下标的时候,通常将其定义为size_t类型,这是一种和机器相关的无符号类型,在cstddef头文件中(也是c语言的stddef.h头文件中)。
范围for也可以遍历数组但是会遍历出所有的数据。

指针和数组
取址符可以用于任何对象面对数组使用下标运算得到该数组指定位置的元素,因此和其他对象一样,对数组的元素使用取址符就能得到该元素的指针。
数组还有一个特性在很多用到数组的地方,编译器都会自动地将其转换为一个指向数组首元素的指针。

由上可知,很多对数组的操作实际上是对指针的操作,如果我们使用数组作为auto变量的初始值时,推断得到的时指针而不是数组

这是因为实际上编译器执行的初始化过程为

指针也是迭代器
vector和string的迭代器支持的运算,数组的指针全部支持 。


这里显然p指向了一个不存在的元素,他的用处就是提供其地址用于初始化。和尾后迭代器一样,尾后指针也不能执行解引和递增操作。
标准库begin和and
c++11中含有两个名为begin和end的函数,这两个函数和容器函数同名,不过数组不是类,所以这两个函数不是成员函数,正确使用的形式是将数组作为他们的参数。

这两个函数定义在iterator头文件中。
指针运算
指针和迭代器具有相同的运算操作。特别的,两个指针相减时,这两个指针必须指向同一个数组的元素,他们相减的结果为ptrdiff_t的标准库类型,和size_t一样,ptrdiff_t也是一种定义在cstddef头文件的机器相关的类型,因为差值可能为负,所以ptrdiff_t是一种带符号类型。
如果两个指针指向不想关的对象,则不能比较他们。
特别的,上述指针运算同样适用于空指针和所指对象并非数组的指针,如果p是空指针,那么允许给p加上或减去一个值为0的常量表达式。两个空指针允许彼此相见,结果为0。
解引用和指针运算的交互

注意括号的使用!
下标和指针

虽然标准库类型vector和string也能执行下标运算,但是数组与他们相比还是有不同,标准库类型下标必须是无符号类型,而内置的下标运算无此要求,内置下标可以处理负值,结果也指向原来指针所指同一数组中的元素。只不过结果不可预测。

C++中有对C的兼容,但这里我们不过多赘述

与旧代码的接口
很多C++程序在标准库出现之前就已经写成,他们肯定没用到string和vector类型。而且有一些C++语言实际上是C语言和其他语言的接口程序,当然也无法使用C++标准库。因此现在C++程序不得不与那些充满了数组或C风格字符串的代码衔接。
混合string对象和C风格字符串
任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代
不能用string对象直接初始化指向字符的指针,为了实现这一功能,string提供了一个名为c_str的函数

顾名思义,c_str返回值是一个C风格的字符串,也就是说函数的返回结果是一个指针,该指针指向一个以空指针结束的字符数组。
我们无法保证c_str函数返回的函数一直有效,如果后续操作改变了s的值就可能让之前返回的数组失去效用。
注意:如果执行完c_str函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。
使用数组初始化vector对象
我们不允许数组为另一个内置类型的数组赋初值,也不允许使用vector对象初始化数组,不过允许使用数组来初始化vector对象。

我们也可以赋值一部分值
