指针与引用的区别

原创 2007年09月29日 16:46:00

指针与引用,在More   Effective   C++   的条款一有详细讲述   
    
  条款一:指针与引用的区别  
   
  指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?  
   
     
   
  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。  
   
  “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”  
   
  char   *pc   =   0;                     //   设置指针为空值  
   
     
   
  char&   rc   =   *pc;                 //   让引用指向空值  
   
                                                 
   
  这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。  
   
     
   
  因为引用肯定会指向一个对象,在C里,引用应被初始化。  
   
  string&   rs;                           //   错误,引用必须被初始化  
   
  string   s("xyzzy");  
   
  string&   rs   =   s;                   //   正确,rs指向s  
   
     
   
  指针没有这样的限制。  
   
  string   *ps;                           //   未初始化的指针  
   
                                                  //   合法但危险  
   
  不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。  
   
  void   printDouble(const   double&   rd)  
   
  {  
   
          cout   <<   rd;                   //   不需要测试rd,它  
   
  }                                               //   肯定指向一个double值  
   
     
   
  相反,指针则应该总是被测试,防止其为空:  
   
  void   printDouble(const   double   *pd)  
   
  {  
   
      if   (pd)   {                           //   检查是否为NULL  
   
          cout   <<   *pd;  
   
    }  
   
  }  
   
     
   
  指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。  
   
     
   
  string   s1("Nancy");  
   
  string   s2("Clancy");  
   
     
   
  string&   rs   =   s1;                   //   rs   引用   s1  
   
     
   
  string   *ps   =   &s1;                 //   ps   指向   s1  
   
     
   
  rs   =   s2;                                   //   rs   仍旧引用s1,  
   
                                                    //   但是   s1的值现在是  
   
                                                    //   "Clancy"  
   
     
   
  ps   =   &s2;                                 //   ps   现在指向   s2;  
   
                                                    //   s1   没有改变  
   
     
   
  总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。  
   
     
   
  还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。  
   
     
   
  vector<int>   v(10);               //   建立整形向量(vector),大小为10;  
   
                                                    //   向量是一个在标准C库中的一个模板(见条款35)    
   
  v[5]   =   10;                               //   这个被赋值的目标对象就是操作符[]返回的值  
   
     
   
  如果操作符[]返回一个指针,那么后一个语句就得这样写:  
   
  *v[5]   =   10;  
   
     
   
  但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)  
   
     
   
  当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针   

 

假设你有  
  void   func(int*   p,   int&r);  
   
  int   a   =   1;  
  int   b   =   1;  
   
  func(&a,b);  
   
  指针本身的值(地址值)是以pass   by   value进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,  
  p   =   someotherpointer;   //a   is   still   1  
   
  但能用指针来改变指针所指向的变量的值,  
  *p   =   123131;   //   a   now   is   123131  
   
  但引用本身是以pass   by   reference进行的,改变其值即改变引用所对应的变量的值  
   
  r   =   1231;   //   b   now   is   1231

指针和引用的区别与相同点

原文地址:http://blog.csdn.net/will130/article/details/48730725 一、指针和引用的定义和性质区别: (1) 指针:指针是一个变量,只不过...
  • metheir
  • metheir
  • 2017年03月01日 12:10
  • 1568

C++引用详解及与指针异同点

一、引用详解 引用:就是对某一变量(或对象)取一个别名,对变量的引用 的操作与对变量本身直接操作完全一样。 引用的声明:类型标识符 &引用名=目标变量名;   如下:定义变量a的引用aa,即别名。  ...
  • ljheee
  • ljheee
  • 2016年08月12日 11:22
  • 1141

java中的引用和C++中的指针的区别

1.类型:引用其值为地址的数据元素,java封装了的地址,可以转成字符串查看,长度可以不必关心。C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。2.所占内存: 引用声明时没有实...
  • b271737818
  • b271737818
  • 2009年02月24日 13:30
  • 8971

JAVA 引用和C语言指针的区别

JAVA中的引用和C中的指针,最好不要混在一起,更不要认为是一回事,只不过他们的作用有些相似,学习者总习惯将它们对比。但在我们写JAVA程序的时候最好忘记C的指针 ,写C程序的时候,也不要老惦记着JA...
  • GUO18735177413
  • GUO18735177413
  • 2015年01月14日 10:04
  • 1543

引用与指针有什么区别?

1. 指针是一个实体,而引用仅是个别名; 2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 4. 引用没有 const,指针有 co...
  • yangkaikwill
  • yangkaikwill
  • 2015年09月05日 22:13
  • 767

c语言初学-引用和指针的异同点

注:(const指针在这里代表的是指向变量的指针,常指针不考虑) 相同点: 1.一个const引用可以引用一个非const变量         int a = 3;         const...
  • like7xiaoben
  • like7xiaoben
  • 2012年03月09日 17:29
  • 6549

C++中指针和引用的区别(超详细)

指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化后不能被改变,指针可以改变所指的对象。 不存在指向空值的...
  • weikangc
  • weikangc
  • 2015年11月10日 17:40
  • 971

c的指针和php中的引用

1-php和c中的变量名都会被解析成内存地址,变量名所代表的内存的地址中内容即代表变量的内容,但由于指针的跳转,这个内容往往并不那么明显 2-在c中不同的变量名即代表不同的内存地址,这个是一一对应的...
  • yangfanzn
  • yangfanzn
  • 2015年03月29日 21:19
  • 712

指针和引用作为参数的区别

int change1(char* name){     name=”alter”;     return 1; } int change2(char* &name){     na...
  • tkp2014
  • tkp2014
  • 2015年08月04日 23:32
  • 371

1.指针和引用的区别

在学习这本书的过程中自己并不是对知识点理解得很透彻,毕竟我没有参加过一些项目,只是自己随便写写代码。可能没有太多的醍醐灌顶的时候,写下这篇文章是希望能给自己总结的同时能帮助一些对C++感兴趣的朋友,对...
  • yuqtj
  • yuqtj
  • 2015年02月11日 01:45
  • 424
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针与引用的区别
举报原因:
原因补充:

(最多只允许输入30个字)