引用(reference)是对象的另一个名字;指针(pointer)用于指向对象,保存的是另一个对象的地址。
引用主要用作函数的形式参数,通常在变量名前添加 “&” 符号来进行定义,不能定义引用类型的引用,但可以定义任何其他类型的引用。
当引用初始化后,只要该引用存在,就保持绑定到初始化时指向的对象,不可能将引用绑定到另一对象。
引用只是它绑定对象的另一名字,作用在引用上的所有操作实际上都是作用在该引用绑定的对象上。
特别注意 const 引用,const引用是指向const对象的引用,可以读取但不能修改。
指针的引入是在 vector 的遍历中出现的。vector 的遍历可以使用下标或迭代器实现,同理,也可用下标或指针来遍历数组。指针是指向某种类型对象的复合数据类型,是用于数组的迭代器:指向数组中的一个元素。在指向数组元素的指针上使用解引用操作符 “*” 和自增操作符 “++”,与在迭代器上的用法类似。对指针进行解引用操作,可获得该指针所指对象的值;而当指针做自增操作时,则移动指针使其指向数组中的下一个元素。
与迭代器一样,指针提供对其所指对象的间接访问,只是指针更为通用,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
一个有效的指针必然是以下三种状态之一:1. 保存一个特定对象的地址;2. 指向某个对象后面的另一对象;0值。指针在使用前必须进行初始化!
对指针进行初始化和赋值有以下四种类型:1. 0值常量表达式;2. 类型匹配的对象的地址;3. 另一对象之后的下一地址;4. 同类型的另一个有效地址。注意:将 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0 ;但允许把数值为 0 或者编译时可获得 0 值的 const 量赋值给指针。把指针初始化为 0 等价于 NULL 。
void* 是一种特殊的指针类型,可以保存任何类型对象的地址,只能在以下三种操作中使用:1. 与另一指针进行比较;2. 向函数传递 void* 指针或从函数返回 void* 指针;3. 给另一个 void* 指针赋值。不允许使用 void* 指针操纵它所指向的对象。
引用和指针之间有两个重要区别。第一个区别在于引用总是指向某个对象;定义引用时没有初始化是错误的;第二个重要区别则是赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。