WEB开发网
开发学院软件开发VC Pointers 与 References(一) 阅读

Pointers 与 References(一)

 2007-03-16 21:57:55 来源:WEB开发网   
核心提示:译者注:本文节选自《How to Think Like A Computer Scientist,Learning with C++》第16章,作者Allen B. Downey),Pointers 与 References(一),此书对于国内“初级”C++爱好者来说,是一本不可多得的入门书籍,

译者注:本文节选自《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;   

16.3 “寻址”操作符

尽管声明指针和references看似一样,但对它们进行赋值却是另一回事。在C++中,还有另外一种操作符需要你了解它,一个通过&符号来表示

的操作符,那就是“寻址”操作符。“寻址”操作符做的事如它的名称一样,返回一个变量、常量标识符或一个数组单元的地址,形式如当前类型的

指针。使用“寻址”操作符,加在变量之前使你得到返回的地址。

   SOMETYPE* x = &sometype; //必须被当作 rvalue 使用。   

现在,不要把“寻址”操作符与声明一个reference搞混淆。因为使用此操作符被严格局限于rvalue,或是等号的右边。编译器知道

&SOMETYPE是“寻址”操作符,表示返回一个SOMETYPE类型指针的地址。

此外,假如你有一个函数,以指针作为参数,你可以在不能声明成指针的变量上使用“寻址”操作符。通过这种方法,你不必再声明一个指针来充当此函数的参数使用。“寻址”操作符可返回一个指针,因此可以在这种情况下使用:

SOMETYPE MyFunc(SOMETYPE *x)
{
 cout << *x << endl;
}
int main()
{
 SOMETYPE i;
 MyFunc(&i);
 return 0;
}  

......待续。

Tags:Pointers References

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接