数组和指针是C++的两种类似于vector和迭代器的低级复合类型。平时应当尽量使用vector和迭代器,只有在强调速度时才在类实现的内部使用数组和指针。
一、 数组
1、数组的缺点:长度固定,无法获取其容量大小。
2、没有所有元素都是引用的数组。
3、非const变量以及到运行阶段才知道其值的const变量都不能用于定义数组的维数。
4、数组下标的正确类型时size_t。
二、 指针
1、和迭代器一样,指针提供对其所指对象的间接访问,只是指针更通用。指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
2、指针保存的是另一个对象的地址。
3、指针保存0值,表明它不指向任何对象。但在赋0值时,只能用0值常量表达式给指针赋值,如整型const对象,字面值常量0等。用int赋值时非法的。
4、Void*指针
可以保存任何类型对象的地址,void *表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。支持的操作有限:
1)与另一指针比较
2)向函数传递void*指针或从函数返回void*指针。
3)给另一void*指针赋值
不允许使用void*操作它所指向的对象。5.12.4待续。
5、指针和引用的比较
1)引用总是指向某个对象,定义引用时没有初始化是错误的。
2)给引用赋值修改的是该引用所关联的对象的值。引用一经初始化,就始终指向同一个特定对象。
6、指针的减法
返回值是ptrdiff_t型,即signed型,表示两个指针之间的差距。
7、指针和const限定符
1)指向const对象的指针
Constdouble *ptr; const限定的是ptr所指对象,而非ptr,允许对ptr重新赋值,但不能通过ptr修改所指对象的值。
使用const void *而不是void*保存const对象地址。
允许把非const对象的地址赋给指向const对象的指针,不能使用这个指针修改对象,但可以使用其他方法修改所指的对象。
在实际程序中,指向const的指针常用作函数的形参。以确保传递给函数的实际对象在函数中不因为形参而被修改。
2)const指针
intnum = 0;
int*const curErr = #
const指针的值不能修改。可以通过const指针修改所指对象。
3)指向const对象的const指针
1)+2)。
8、 创建动态数组
1) New/delete,占用的空间在堆,new表达式返回指向新分配数组的第一个元素的指针。
2) 动态分配数组时,若是类类型,则使用默认构造函数初始化。若是内置类型,则无初始化。
也可以使用int *pia = new int[10]()初始化。
3)允许动态分配长度为0的空数组。对其不能进行解引用操作。允许比较和加减0操作。
三、C风格字符串
通过char*来操纵,使用指针的算数操作来遍历字符串。如char*s = “hello”,相当于先给字符串分配空间,然后将基地址赋给s。
应当避免使用,尽量使用string。