我们先研究两种类型:引用和指针。
引用
note:c++11中新增了一种引用:所谓的“右值引用”,我们将会在后面具体的学习。当我们提到引用时,指的是“左值引用”。
引用为对象起了另一个名字,引用类型引用另外一种类型。通过将声明符声明成&d的形式来定义引用类型,其中d是变量名:
int value = 1024;
int &d = value; //d指向value(d是value的另一个名字)
int &value2; //错误,引用类型必须初始化引用即别名:引用并非对象,相反,它只是一个已经存在的对象所起的另外一个名字。
定义一个引用之后,对其进行的所有的操作都是在与之对应的对象上进行的。
d = 2; //把2赋给d指向的对象,此处即是赋给value
int a = d; //与a = value的结果一样。
指针
指针是指向另外一种类型的复合类型。
定义指针的方法是将声明符写成*d的形式,其中d是变量名。
int *p1,*p1;//p1,p2都是指向int型对象的地址
double *q1,*q2;//q1,q2都是指向double型对象的地址
获取对象的地址
指针指向某个对象的地址,获取对象的地址使用取地址符(&)。
int a = 2;
int *b = &a;
第二句定义了一个int型指针b,随后初始化b令其指向int型对象
所有指针的类型都要和它指向的类型严格匹配
int a = 1;
double *b = a;//错误
利用指针访问对象
如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象。
int val = 4;
int *p = val;
cout << *p;//由符号*得到指针所指向的对象
空指针
空指针不指向任何对象,在试图使用一个空指针之前代码可以首先检查它是否为空。
以下为几种生成空指针的方法:
int *p1 = nullptr;//c++11新规范,等价于int *p1 = 0;
int *p2 = 0;//需要先#include cstdlib
int *p3 = NULL;//等价于int *p3 = 0;需要先包含头文件。NULL为预处理变量
最好使用nullptr,同时尽量避免使用NULL
赋值和指针
引用和指针都能提供对对象的间接访问。
然而具体的实现细节中,二者有很大的不一样,最重要的就是引用不是对象,在使用方面会到一个引用无法二次赋值的受限。
指针却是无限制的,它可以和普通的对象一样使用。
void*指针
void*类型的指针可以存放任意类型的指针