Pointers 与 References(一)

2016-01-29 12:20 4 1 收藏

Pointers 与 References(一),Pointers 与 References(一)

【 tulaoshi.com - C语言心得技巧 】

Pointers 与 References(一)


编译:肖德时

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)



译者注:本文节选自《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; }     
......待续。

来源:http://www.tulaoshi.com/n/20160129/1485631.html

延伸阅读
宝贝,笑一个 有没有觉得,在你疲劳到要崩溃的时候,一见到小宝贝的笑容,顿时就精神振奋?有没有发现,只要是小宝贝出现的地方,都会有人努力地讨好,只为博得他一笑? 身边的好友陆续享受起当妈妈的乐趣。尽管耳边也时常会响起这些新妈妈们在养护宝宝过程中的辛酸经历,可更多的仍然是“有子万事足”的满足与骄傲。到底,宝宝们施展了什么魔...
标签: PHP
  Haohappy http://blog.csdn.net/Haohappy2004 SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么非常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。下面来谈谈SQL注入攻击是如何实现的,又如何防范。 ...
   在使用VB调用VC写的DLL的时候,可以实现一些VB不能实现或者很难实现的功能,但是,因为VB与VC之间的数据类型并不总是完全对应的,所以,在进行参数传递的时候,就需要进行类型转换了。下面我将通过逐步的推进的方法,来看看如何达到VB与VC之间的通信。     首先,看一个简单的例子。 VC中的程序: extern "C" _...
标签: ASP
  ASP与JSP的比较(一) 从微软推出了ASP(ActiveServerPage)后,它以其强大的功能,简单易学的特点而受到广大WEB开发人员的喜欢。但是它却有微软产品的通病,只能在Windows平台下使用,虽然它可以通过增加控件而在LINUX下使用,但是其功能最强大的DCOM控件却不能使用。而SUN公司在JAVA的基础下开发出的JSP(Java ServerPages)实现了动态...
标签: Delphi
  在应用程序开发中如何检测、处理程序的运行错误是一个很重要的问题。在 Delphi 的集成开发环境 ( IDE ) 中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、...

经验教程

225

收藏

45
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部