文章目录
C++程序设计语言(五)——引用和指针
复合类型(compound type)是指基于其他类型定义的类型。通常是一个基本数据类型(base type)和紧随其后的一个声明符(declarator)列表组成。
引用(reference)
为对象起另一个名字。一般在初始化变量时,初始值会被拷贝到新建的对象中。然后定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用(引用即别名)。
int ival = 1024;
int& refVal = ival; //refVal指向ival(是ival的另一个名字)
int& refVal2; //报错:引用必须被初始化
为引用赋值,实际是把值赋给了与引用绑定的对象。获取引用的值,实际是获取了与引用绑定的对象的值。
引用的定义
可以在一条语句中定义多个引用,每个引用都以&开头且只用定义引用时&才表示引用。
指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但是我们可以定义指向指针对象的引用。
int i = 16;
int* p; //p是一个int类型的指针
int*& r = p; //r是一个对指针p的引用,也就是说r是p的别名
r = &i; //r引用了一个指针,因此给r赋值&i就是令p直线i
*r = 0; //对r解引用的到i,也就是p指向的对象,并将i的值改为0
指针(pointer)
它指向另一种类型的复合类型,存放着这个对象的地址。
- 指针本身也是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后只想几个不同的对象。
- 指针无须在定义时赋值。
int* ip1,* ip2; //ip1和ip2都是指向int类型对象的指针
double dp,* dp2; //dp是double类型的对象,dp2是指向double类型对象的指针
获取对象的地址
想要获取一个对象的地址需要使用取址符&。
int ival = 42;
int* p = &ival; //p存放变量ival的地址,或者说p时指向变量ival的指针
int* p2 = p; //p2是指向p指向的变量的指针
指针值
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针
- 无效指针,试图拷贝或者其他方式访问无效指针的值都会引发错误。
利用指针访问对象
如果一个指针指向一个对象,可以使用解引用符*来访问该对象。同时,与引用类似,修改了这个对象的值的同时,对所有指向该对象的指针解引用得到的值都发生改变。
空指针(null pointer)
空指针不指向任何对象,在使用一个指针之前我们应当检查这个指针是否为空。如果我们想要得到一个空指针,我们应当使用字面值nullptr来初始化指针(定义一个指针时,如果不用其他对象初始化,一定要使用nullptr来初始化这个指针,未初始化的指针常常会引发一系列错误)
注:nullptr是C++11新标准刚刚引入的一种方法。如果你想要使用,请确保你的编译器中是C++11标准。
void* 指针
void*指针可以用于存放任意对象的地址。所以当使用的时候,我们也并不知道该地址中是一个什么类型的对象。
指向指针的指针
我们可以通过* 的个数来区分指针的级别。* *表示指向指针的指针, * * *表示指向指针的指针的指针。