2.3复合类型
2.3.1引用
引用包括左值引用和右值引用,我们通常说的是左值引用,引用必须初始化,一旦初始化完成,引用将和它的初始化值对象之一绑定在一起。
引用本身不是一个对象,它只是为一个已存在的对象所起的另外一个名字,因此不能定义引用的引用。
引用在定义时要和绑定的对象严格匹配。而且引用只能绑定在对象上,不能与字面值或者某个表达式的计算结果绑定在一起。
2.3.2指针
指针实现了对其它对象的间接访问。
指针与引用的不同:
- 指针本身是一个对象,可以进行赋值和拷贝。
- 指针无需在定义是=时进行赋值操作。
指针可以利用&获取某个对象的地址,但是引用不是对象,没有实际地址,因此不能定义指向引用的指针。指针指向的对象必须和指针的类型匹配。
指针可以利用*访问某个对象,解引用操作仅适用与确实指向了某个对象的有效指针。
指针可以定义为空,不指向任何对象。在定义指针时要对指针进行初始化,并且尽量在定义完对象之后再定义指针。避免使用未初始化的指针。(?未初始化的指针和无效指针有什么区别)
//生成空指针的方法
int *p1 = nummptr; //等价于int *p1 = 0;
int *P2 = 0; //需要加头文件#include cstdlib 直接将p2初始化为字面常量0
int *p3 = NULL' //等价于int *P3 = 0;
void*是一种特殊的指针类型,可用于存放任意对象的地址,但是我们不能访问内存空间中所存的对象。使用具有局限性。
2.3.3理解复合类型的声明
可以定义多个变量,但是类型修饰符(*,&)仅作用于紧随其后的变量,对剩余的变量没有影响。
int* ip, i, &r = i; //定义一个整形指针ip,一个int变量i,一个指向变量i的引用r
2.4const限定符*
const对象必须初始化。默认状态下const对象只能在文件内使用,如果想在多个文件中共享const对象,必须在变量的定义之前加上extern关键字。