引用与指针
复合类型(compound type)是指基于其他类型定义的类型,引用和指针是其中的两种。
一般地,一条声明语句由一个基本数据类型(base type)和紧随其后的一个声明符(declarator)列表组成。
引用
当我们使用“引用(reference)”时,指的其实是“左值引用(lvalue reference)”。
引用为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成$d
的形式来定义引用类型。在定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。引用将和它的初始值对象一直绑定在一起,无法令其绑定到另外一个对象。
为引用赋值,实际上是把值赋给了与引用绑定的对象。获取引用的值,实际上是获取了与引用绑定的对象的值。以引用作为初始值,实际上是以引用绑定的对象作为初始值。
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&
开头。
引用的类型都要和与之绑定的对象严格匹配。引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。
1 | int ival = 1024; |
指针
指针(pointer)是“指向”另外一种类型的复合类型。指针也实现了对对象的间接访问,但与引用相比也有不同:
(1)指针本身就是一个对象,允许对指针赋值和拷贝,在指针的生命周期内它可以先后指向几个不同的对象。
(2)指针无须再定义时赋初值。如果没有被初始化,将拥有一个不确定的值。
指针运算符*
,取地址符&
指针的类型都要和它所指向的对象严格匹配。因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。
指针变量:专门用于存放指针(某个变量的地址)的变量
1 | int c = 76; |
通过指针变量可以访问“它所指向的变量”。指针变量也是变量,是变量就有地址。
1 | int c = 76; |
赋值和指针:记住赋值永远改变的是等号左侧的对象,就能分清一条赋值语句是改变了指针还是改变了指针所指的对象的值。
1 | int i = 42; |
&与
*`的运算优先级:同级
空指针(null pointer)不指向任何对象。
1 | int *p1 = nullptr //C++11 |
使用未经初始化的指针是引发运行时错误的一大原因。因此建议初始化所有的指针,尽量等定义了对象之后再定义指向它的指针。
void*
指针:可用于存放任意对象的地址。利用void*
指针可以:拿它和别的指针比较,作为函数的输入或输出,或者赋给另外一个void*
指针。不能访问其内存空间中所存的对象。
1 | double obj = 3.14, *pd = &obj; |