译者注:本文节选自《How to Think Like A Computer Scientist,Learning with C++》 第16章,作者Allen B. Downey)。此书对于国内“初级”C++爱好者来说,是一本 不可多得的入门书籍。我的这版是PALM电子书。
正文:
我认为最简单的方法解释Pointers 和 References就是举例证明了。首先让我们看一些表 达式:x=1;
在表达式中,当你使用一个变量,特别是一个字母或标记符来 存储数据。在编程过程中,上面等式中的变量一定是在等号的左边。
你可能已经注意到了编译器不充许你像这样写代码:1=x;
假如你不知道,你现在应该知道,并且理解它,这是最关键的。当你得到编译运行期错误 ,如:"lvalue requied in ..."是因为等号左边通常被当作lvalue的值,必须是 内存中的一个地址。
让我们想一想。假如你想存储数据,在存储数据操作之前知道在哪里存储。lvalue值就是 在内存里的一段地址,来存放你的信息或等号右边的数据,同理的还有rvalue值。
在C++中,你将经常这样或那样涉及内存管理。操作地址,C++有两种机制:Pointers 和 References。
16.1 什么是Pointers和 References
Pointers和 References是特殊变量,以存储内存地址当作它们的值。在你学会这些之前 ,其它相关的不同类型的数据类型还有:
int,double和char。Pointers和 References存放着已经声明并赋值的,不同数据类型的 ,你所操作数据的地址。这两种机制 Pointers 和 References,有着不同的语法和不同的惯 性使用方法。
16.2 声明Pointers和 References
当对一个对象或数据类型的指针进行声明时,你照例地使用声明变量和数据类型的方法, 仅是现在,对于声明SOMETYPE的指针,你需要在数据类型和它的变量之间加上星号*。
SOMETYPE* sometype;
int* x;
对于声明一个reference,你做的事情是和声明一个指针完全一样的,仅仅这次你不使用 星号*,使用—来替换。
SOMETYPE& sometype;
int& x;
可能你已经学过,空位在C++中是不被考虑的,所以以下的指针声明都是一样的效果:
SOMETYPE* sometype;
SOMETYPE * sometype;
SOMETYPE *sometype;
以下的references声明同理也是一样:
SOMETYPE& sometype;
SOMETYPE & sometype;
SOMETYPE &sometype;