2.5 地址、指针和引用

地址

在C++中,地址标号使用十六进制表示。取一个变量的地址使用“&”符号,只有变量才存在内存地址,常量(见2.6节)没有地址(不包括const定义的伪常量)。例如,对于数字100,我们无法取出它的地址。取出的地址是一个常量值,无法再对其取地址了。

指针

指针的定义使用“TYPE*”,TYPE为数据类型,任何数据类型都可以定义指针。指针本身也是一种数据类型,它用于保存各种数据类型在内存中的地址。指针变量同样可以取出地址,所以会出现多级指针。

引用

引用的定义使用“TYPE&”,TYPE为数据类型。在C++中是不可以单独定义的,并且在定义时就要进行初始化。引用表示一个变量的别名,对它的任何操作,本质上都是在操作它所表示的变量。详细讲解见2.5.3小节。

2.5.1 指针和地址的区别

在32位操作系统下,地址是一个由32位二进制数字组成的值。为了便于查看,转换成十六进制数字进行显示,用于标识内存编号。指针是用于保存这个编号的一种变量类型,它包含在内存中,所以可以取出指针类型变量在内存中的位置—地址。由于指针保存的数据都是地址,所以无论什么类型的指针都占据4字节的内存空间,如图2-9所示。

图 2-9 地址和指针

指针可以根据指针类型对地址对应的数据进行解释。而一个地址值无法单独解释数据,对于图2-9中0x0012FF68这个地址值,仅仅凭借它自己无法说明该地址处对应数据的信息。如果是在一个int类型的指针中保存这个地址,就可以将0x0012FF68这个地址值看做是int类型数据的起始地址,向后数4字节到0x0014FF6C处。将0x0012FF68~0x0014FF6C中的数据按整型存储方式解释,详细讲解见2.5.2小节。

指针和地址之间的不同点如表2-2所示。

指针和地址之间的共同点如表2-3所示。